C/C++

This - указатель

Здравствуйте и сначала немного осебе ( чтобы не смеялись с вопроса ) - я учусь в компьютерной академии на программиста, а так как учица приходица на полустацыонаре, то соответственно приходица больше половины материала изучать самому. Поэтому, если уж Вам нетрудно будет помочь, то вопрос мой заключается в следующем. При написании консольных приложений, часто приходитса использовать строки. Описание же строк я пытаюсь сделать след образом:
class name{.....
........ void NAME(){
short x[]={2.67.23.56.34.........}
//далее приходица делать следующее
char *a=new char[n];
short c=0;while (c<n){
a[c]=(char)x[c];c++;}
return;}
Теперь сам вопрос. Пытаясь обойти использование дополнительных ресурсов, я пытаюсь сделать просто
........ int NAME(){
short x[]={2.67.23.56.34.........}
return (int)this;}
чтобы читать массив прямо из тела программы, но я не могу понять на что конкретно указывает указатель? при попытке пролистать код я не могу найти свой массив символов, хотя пробовал возвращать и просто this и (*this). если можете порекомендовать, как правильно делать подобные вещи, очень прошу Вас выложить Ваш совет тут или, если это для Вас затруднительно, то по моему текущему почтовому адрессу:
sergey-butov@yandex.ru
Сообщение отредактировал sergey butov - 22:02:2007, 16:13
Думаю, выражу общее мнение, если скажу что ничего не понятно из твоего поста - и кривой язык прекрасно дополняет невнятные name, NAME, x. Какая задача стоит? какие проблемы - ничего не описано.
Предположу что выражение Код
На самом деле помоему я задал вопрос - "...чтобы читать массив прямо из тела программы...", а примеры, которые я привёл, конечно оставляют желать лучшего, но повторюсь - я ещё учусь и для того, чтобы Вы мне не делали зимечания по поводу величины поста, я решил их написать сокращённо. Что конкретно непонятного в этих примерах? Строки, как их пишут по классике и строки, как их пишу я - это разные вещи, но не считаете ли Вы, что мне требуется поместить здесь весь код? Допустим, что я буду писать массив сразу в char, а как тогда быть с графическими символами и например с символами кириллицы?
Ну так строка в С - такой же массив как и из int. Что мешает так:
Код
ох уж мне эти венгры))).... я пытаюсь прочесть код, описанный в массиве, прямо из тела программы, но не пойму, как правильно это сделать, потому как никогда не пользовалса указателем this. у меня не получаеца сослаца на свой собственный массив и для его описания я создаю в классе функцию, используемую только для возвращаения указателя this... вот и всё)))
да и стати, венгерской нотацией для консоли я не пользовалса.... пока что)))
Сообщение отредактировал sergey butov - 22:02:2007, 13:47
ох уж мне эти венгры! Накой тебе this вообще? В классе определена строка и ту хочешь получить указатель на нее? Ну так сделай метод, который будет возвращать указатель на строку, если ты считаешь, что такой подход безопасен. Корректно поставь вопрос, в конце концов
Цитата
Про на кой оно мне нужно скажу только, что в кач эксперимента. Вообще в написании кода я пытаюсь отказываться не только от средств С++ но и использование средств С я тоже пытаюсь свести к минимуму.... например вместо if использовать тернарные операцыи выбора(не говоря уже о switch))). стараюсь уменьшать количество циклов и тд и тп и др... это, как показывает моя, хоть и не большая, но всё же практика, очень влияет на скорость и обьём приложения, а нащот вопроса...попытаюсь обьяснить ищо раз. вот есть массив так? (пока что неважно, какого типа данных). Как мне сделать указатель на него? Только вопрос в том, что указатель должен указывать на его расположение в теле приложения, а не на выделяемую под него статитескую или динамическую память? Я уже говорил, что пытаюсь создать, скажем так, неиспользуемую функцию, которая содержит только статический массив и возвращает указатель на себя, а потом исходя от этого указателя, пытаюсь получить доступ к этому массиву, зашитому в коде приложения, а не к памяти, выделяемой под него..... Надеюсь, что так будет понятно, потому что понятней обьяснить я уже не в силах))))
P.S. Там, стати, в коде, который я пыталса привести я пропустил скобки функций. Это ответ на Ваш вопрос по поводу name и NAME... сорри)))
Сообщение отредактировал sergey butov - 22:02:2007, 16:22
Гм. А заглянуть в ассемблер твой опыт позволяет?
Код
Ну вот уже чтото похожее))))..... На самом деле х86 я не знаю и пока мне нет времени (учоба) для его изучения, поэтому приходица судить по 8мибитному и использовать древние методы))). О тернарных операторах придумал не я, а вроде как препад сказал. Но соприть не буду ( хотя обычным замеров времени есть всё таки разница, правда незначительная но всё же)... чтоже касаеца массива и его чтения из тела программы то..... я же говорю, что хотел поэкспериментировать.... ведь зачем переписывать массив ещо раз если он уже есть в коде? Впрочем можно его оформить отдельным файлом и всё такое, но подгрузка не всегда приемлема да и ведь интересно же ))))) Вдобавок, я сторонник выворачивания своего компьютера наизнанку
ЗЫ: Посибо)
ЗЗЫ: MSVC rulezzz!!!
Сообщение отредактировал sergey butov - 22:02:2007, 17:52
Разница будет только в простейшем случае:
Код
Я как раз и имел ввиду простейшие случаи, тем более что я както не умею функции всовывать в тернарные операции.... А что касаеца копирования массива, то вот как раз этого я и хотел избежать, ведь система всё равно будет создавать описываемый статический массив, то есть при том методе, который я пытаюсь использовать, массив будет один раз создаваться статически, а второй раз создаваться динамически и переписываться. на шо оно надо?)))
Сообщение отредактировал sergey butov - 22:02:2007, 18:06
Ладно, спорить не буду - не понимаю чего ты добиваешься. Но мне кажется что ты где-то заблуждаешься про использование строк.
Возможно, но говорю опять же, когда, допустим, нужно использовать графические символы, то простым методом слишком уж часто придёца писать явные приведения, вот я и решыл особоне парица и просто сделать массив в котором строки описаны кодом, а как уже работать с таким массивом, это вопрос номер два))))... единственно в чом я спотыкнулса - это указатель на него
Для: grigsoft
Стати, сансэй , а раз уж Вы шарите в х86, то можыт дадите ссылочку на таблицу работы команд по тактам, и воопще, порекомендуете литературку качнуть для начинающих? Оч хотелось бы...
Сообщение отредактировал sergey butov - 22:02:2007, 23:50
Не, в асме я почти не шарю - хотя 10 лет назад в универе и учил, на практике опыт есть только в отладке без исходного кода. Таблицу тактов, уверен, можно найти в сети, а книжки - в мое время классикой был Абель, но тогда мало что читать было. Для обычного программиста любой книжки будет достаточно чтобы научиться читать код без особых проблем.
Для: sergey butov
Очередное изобретение велосипеда, причем неясно какого. Вам, видимо, слова совместимость, переносимость и сопровождение кажутся пустым звуком. Хотя для троянов и вирей сопровождение до одного места
На самом деле что касаеца книг по асемблеру то описание команд я нашол, есть и книга, но не бесплатно и очень похоже на лохотрон ( нужно отослать смс за 0.5 доллара). А вот таблицы тактов чота я не нашол. По поводу совместимости и тд., ну чтож, я ещо не работал в команде и только начал учица, но всё ищо впереди.
ЗЫ: С ПРАЗДНИКОМ!!!
Цитата(sergey butov @ 23:02:2007, 14:43 )
http://www.realcoding.net/article/view/1068
Цитата(grigsoft @ 23:02:2007, 15:16 )
Для: European
....Т.е. сначало надо выполнить оптимизация на высоком и среднем уровнях, а только потом переходить к тактам
Сансей, Вы сами ответили по поводу велосипеда
А нащот тактов могу только сказать, что для ПРИБЛИЗИТЕЛЬНОГО сравнения кода.... Да и вообще, допустим для сравнения разницы между делением и умножением (лично я стараюсь использовать умножение), помоему будет всё настолько линейно, что кэшу трудно будет промахнуца. Хотя, возможно я ошыбаюсь, но тем не менее всё равно спасибо)))
Для: grigsoft
Посибо)))) Щя позырю...
Для: grigsoft
да уш ... .... внатуре рилкодинг. Путёвый сайтец.Ищо рас ПОСИБО!!! Ато пришлось вчера нарыть 8битные эмулятор и прошивку на z80. Теперь у меня есть возможность оценить всё это более прогрессивно
Сообщение отредактировал sergey butov - 23:02:2007, 16:24
И стати, можыт лучче создать отдельный топик для обсуждения оптимизацыи, ато вроде как оффтоп получаеца? Будем там под Вашем присмотром делица собственными соображениями и способами?
Подразделов и так слишком много. Ты ж на С++ пишешь? Вот и спрашивай тут, если что, обсудим
Для: grigsoft
Хорошо, тогда вопрос: в том примере, который Вы привели используеца, как я понял, преобразователь мнемоники в код _emit. А нет ли средств написания машинного кода в си без этих преобразователей? Просто у меня около 2,5 кб описания строк в приложении и для каждого байта прописывать _emit ... ну скажем так, напряжно)))))
То что ты пытаешься сделать суть богопротивно и неестественно, так что не жди помощи от компилятора. Однако простенькая дополнительная программка или макро в MSVC помогут тебе добиться твоих мерзких целей
PS. Для вставки асма есть __asm{} , но тебе ведь надо чистые байты пихать.
Для: grigsoft
Ну да, ну да.... А по поводу this... Я чото так и не вкурил.... У дебагера ваще свой взгляд на адреса. Вроде возвращаю указатель на себя, а разница между тем, что выдаёт приложение и дебагер огромная(((... Чую я, что придёца сделать просто отдельным файлом, хотя сёдня в академию - ищо там проконсультируюсь. Стати в массиве (неважно какого типа), дописываеца не заголовок, а ищо несколько байт к каждому элементу, или Вы это имели ввиду? И интересна, нащот тернарных операторов, можно ли туда встраивать функцыи или я прав)))?
Сообщение отредактировал sergey butov - 24:02:2007, 09:47
Гм. Да нет в массиве никаких дополнительных байт. Разве что если ты структуры складываешь - тогда выравнивание начинает работать - попробуй в настройках С++\CodeGen выравнивание в 1 поставить. Ну еще данные выделяемые через new в дебаге обрамляются 4 байтами с обеих сторон.
А как ты смотришь что приложение выдает? Если в релизе, то разница будет, конечно. А так - может зависеть от уровня наследования классов. Можешь попробовать пересобрать начисто, если дебаг стал ерунду показывать.
Для: grigsoft
Вот, что я сечас делаю ( тока не пугайтесь))))..... Это работа на игзамен по с++, правда недоделанная. Удалите потом, как глянете
MSVS 6
Project .....win 32 console app
File .......... source file (.cpp)
Сообщение отредактировал sergey butov - 24:02:2007, 12:01
Ну результат, конечно, неплох. Но код - это просто ужас. Комментариев нет, куча операторов в строке, читать невозможно.
И, говоря об оптимизации - о каких тактах процессора может идти речь, если ты тупо обновляешь экран консоли 5 раз в секунду независимо от наличия изменений.
Дополнение. Посмотрел повнимательнее - ты что, код специально чем-то обработал? Потому что я не верю, что человек без наркоты может писать такой код:
КодЗдравствуйте и сначала немного осебе ( чтобы не смеялись с вопроса ) - я учусь в компьютерной академии на программиста, а так как учица приходица на полустацыонаре, то соответственно приходица больше половины материала изучать самому. Поэтому, если уж Вам нетрудно будет помочь, то вопрос мой заключается в следующем. При написании консольных приложений, часто приходитса использовать строки. Описание же строк я пытаюсь сделать след образом:
class name{.....
........ void NAME(){
short x[]={2.67.23.56.34.........}
//далее приходица делать следующее
char *a=new char[n];
short c=0;while (c<n){
a[c]=(char)x[c];c++;}
return;}
Теперь сам вопрос. Пытаясь обойти использование дополнительных ресурсов, я пытаюсь сделать просто
........ int NAME(){
short x[]={2.67.23.56.34.........}
return (int)this;}
чтобы читать массив прямо из тела программы, но я не могу понять на что конкретно указывает указатель? при попытке пролистать код я не могу найти свой массив символов, хотя пробовал возвращать и просто this и (*this). если можете порекомендовать, как правильно делать подобные вещи, очень прошу Вас выложить Ваш совет тут или, если это для Вас затруднительно, то по моему текущему почтовому адрессу:
sergey-butov@yandex.ru
Сообщение отредактировал sergey butov - 22:02:2007, 16:13
Для: grigsoft
Про обновление экрана могу только сказать, что прога недописана и я для того и делаю такую прорисовку, чтоп вовремя споймать бока ( по мерцанию)
)))) А нащот наркоты.... ммммм.... трезвый, пока что.... Что конкретно смущает в коде?
ЗЫ: как доделаю, вышлю бета версию
Сообщение отредактировал sergey butov - 24:02:2007, 13:14
Что смущает? То что этот код даже ты сам через месяц не прочитаешь. А если я тебя попрошу через месяц буковки над сеткой переместить вниз, и цифры влево, то тебе окажется проще все заново написать. Уверен, ты и сейчас не сможешь этого сделать даже за пару часов.
Для: grigsoft
Давайте лучче др задание, ато скажете что я полдня возилса, или если уш хотите меня проверить, то можно договоритса но определённое время
Сообщение отредактировал sergey butov - 24:02:2007, 18:56
Я же не учитель, чтобы тебя проверять, и мне совершенно по барабану сколько ты будешь это делать. Сделай для себя, если хочешь. Если ты можешь внести такие изменения в твой код за пару минут, как это заняло бы в нормальном ООП подходе - я снимаю шляпу. Впрочем, я все равно уверен что через месяц ты не сможешь этого сделать, если не будешь каждый день над кодом корпеть.
Проблемы с твоим кодом:
1. Стратегические - это не ООП. Использование слова class не делает твой код объектно-ориентированным. Все свалено в кучу - данные, обрамление, рисовка таблицы, меню, работа с пользовательским вводом. Массив с кучей данных, в который свалено вообще все что используется - это нечто невообразимое. Структура программы совершенно не просматривается.
2. Тактические - отсутствие стандартного выравнивания (хоть какого), куча операторов в строке (так делать можно только в простейших случаях), нет комментариев, основные использованные переменные - А и В (и ты еще снисходительно улыбаешься над венгерской нотацией?).
Возможно ты гений и прирожденный хакер - я лично не понимаю как можно ориентироваться в такой программе. Но с таким подходом у тебя не будет шанса получить работу, и ты сам никогда не сможешь написать и сопровождать что-то чуть более сложное чем игра Морской бой.
К сожалению, в мое время не учили программировать - я не помню, чтобы даже в универе кто-то просматривал код программ, которые мы сдавали - а это более важно. Может хоть сейчас этому будут учить? Вроде была пару книжек по этому поводу. Для себя - скачай исходники какой-нибудь программы, поизучай подход к оформлению кода. Да хоть бы грид (http://www.codeproject.com/miscctrl/gridctrl.asp). Он далеко не образец стратегического дизайна, но над ним давно работают разные люди, что заставляет держать код нормально читаемым.
Задание заключалось в том, чтобы сделать морской бой с использованием класса обработки строк и во первых я уже говорил, что программа недописана ( я её привёл только для того чтобы вы примерно поняли, что я пытаюсь сделать), а во вторых.... работает то быстро?Ипользование массивов переменных А и В даёт возможность более гибко адресоваться к ним. Да и вообще, вы видели исходники quake? Там даже не c++, а c, по большей части. В своём коде я могу разнести операторы и функции, а также дописать комменты в любой момент.
ЗЫ: Много чего можно сказать, но давайте лучче я выложу конечный результат тут?
Сообщение отредактировал sergey butov - 25:02:2007, 16:42
Цитата
Цитата(grigsoft @ 25:02:2007, 17:30 )
Вот кстати ссылочка в тему:
http://www.research.att.com/~bs/JSF-AV-rules.pdf
правила оформления кода в софтверном подразделении LockheedMartin - я так понял код для всяких демо и, возможно, собственно софт в истребителях.
О том как серьезные компании походят к коду.
Посибо за ссылку. Стати, а по MFC, не шариш случаем? Ато мы тут начали учить, а я много пропустил. Если можеж проконсультировать. ..
1. Как в мсвс 2005 вызвать class wizard? в мсвс 6 - ctrl+w, а вот в 2005 чота я непонял.
2. Как связать управление с обьектом ( например меню с диалоговым окном)?
Помоги, плыз
Что касаеца того приложения,то я решыл просто создать массив scr в котором будут описаны два окна: окна расстановки кораблей и окно самой огры. То есть массивы grid и field будут просто зашиты в массив scr. Так по крайней мере будет быстрее работать прорисовка. Попробую так, а там видно будет
1. Без понятия - сам сижу на VS6 все еще.
2. Визуально - никак. Добавляешь обработчик команды меню (ручками или визардом) и вписываешь работы с диалогом.
Цитата(sergey butov @ 26:02:2007, 19:17 )
Цитата(sergey butov @ 21:02:2007, 22:12 )
Ой. спасибо sergey butov за создание этой темы. Без обид, я от души посмеялся .
Приношу извинения за такой огромный пост, прочёл всё и просто не мог удержаться от комментариев!
Честно говоря не пойму как можно объявить массив, а чуть ниже обращаться к указателю this и не понимать почему ничего не читается. this и объявленный чуть выше массив никак не связаны друг с другом :=), и вот это "return (int)this;" вернёт совсем не эл-ты массива, а адрес экземпляра объекта (число)! :=). Через него можно обращаться к свойствам и методам объекта типа:
Код
2: ALL
Дароф ищо рас.... У меня небыло денех на инет, я даже успел соскучица за вашыми советами
Для: grigsoft
Посибо, уже нашол путёвую книшку ( А. Мешков, Ю. Тихомиров: Visual C++ и MFC... Могу слить суда. ) терь сижу ночами читаю)))) Асталось тока по 2005 найти.
Для: European
Тожы посибо)))
Для: Igorg
Благадарю. Оч толковое замечание))). Я уже в прицыпе отказалса использовать то, что пыталса сделать, Вы меня лишний раз убедили ы этом.
Ну и теперь по порядку для: Artexoid
1.
...Честно говоря не пойму как можно объявить массив, а чуть ниже обращаться к указателю this и не понимать почему ничего не читается. ..
Дайствительно плохо читаеца..... Я там писал что никогда не испльЗовал this.
2.
...Это точно, тернарные операции в С и С - подобных языках только и есть :=) ...
Разница между средствами чистого С и С++ помоему всё таки есть. Перечитайте полностью пост.
3.
По поводу кода вообше. Я писал это не для показа кому либо, а для того, чтобы определиться, что должно уметь создаваемое приложение, т. е., другими словами, черновик, о чом я тоже писал выше.
4.
За совет по поводу _emit посибо))))
sergey butov
Цитата(sergey butov)
Блин, а суда можна .pdf включать? Или глюк системы? Выдаёт "невозможно отобразить страницу".((( Попробую ищо .sfx
И нифига.... Какой обьём можно сливать суда? У меня два тома, весят ~44 МБ
Цитата(sergey butov @ 4:03:2007, 10:18 )
Для: sergey butov
Указывайте линк на книгу .. такой объём закачать не получится...
Во блин, я думал что у каждого раздела свой модер)))), аказуеца получают все....
Для: Igorg
Я п с удавольствием, но непомню на какой компе у нас в академии))). Лучче ночью залью по совету grigsoft на некий rapidshare.com, а туда уже и постараюсь дать ссылку.
Для: Barmutik
Ок, посиба)))
Сообщение отредактировал sergey butov - 5:03:2007, 05:24
_____
Сообщение отредактировал DROSSEL - 5:03:2007, 10:08
Для: Всех
Ёлы палы, а как изменить ник?
Вот Вам цыклопедия
http://rs49.rapidshare.com/files/19450061/____________.exe
Сообщение отредактировал sergey butov - 5:03:2007, 10:03
Кто нить слышал мой вопрос?
Цитата(DROSSEL @ 6:03:2007, 20:28 )
Посиба за потсказку.... Чото протупил я))))