Current time: 13.04.2024, 23:14 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
С++, общая тема
Author Message
packa Offline

Posts: 1210
Post: #121

Quote:У тебя массив kakoy_to_massiv состоит лишь из 5 элементов, в то время как ты пытаешься "пройтись" вплоть до шестого его элемента (индексы от 0 до 5 включительно, то бишь всего 6 штук).
Наследие со школы <_< там мне не давали использовать нулевую ячейку...
Спасибо, долго бы еще ломал моцк...
Quote:Да и объявлена функция kakaya_to_functcia как-то коряво.
Да, так изначально так и было. После ошибки развернул баталию по отлову, для чего и включил указатель на 5-ый элемент.
Quote:Кстати, скажу тебе по секрету: запись &kakoy_to_massiv[0] эквивалентна записи kakoy_to_massiv Поскольку "имя массива" в С - это и есть адрес его первого элемента.
Да,читал про это Sm Только вот невнимательно, из-за чего написал &kakoy_to_massiv и схлопотал ошибку Sm

---
А есть не сложное объяснение почему оно все таки отображает то что мне нужно?
И как в этом помогает бесполезный код по выводу адреса? С ним даже
PHP Code:
//*g=7; //Попытка изменить 5-ый элемент вручную 

   начинает работать
Что происходит при присвоении kakoy_to_massive[5]? Ведь ее как бы не существует, сама создается? (или переходит снова на 0 элемент, затирая старое значение?)

Да, статья хорошая, только поздно ее увидел Sm

Quote:P.S. А вообще здорово, что ты пытаешься разобраться с указателями. Это, возможно, самый сложный шаг в освоении C++.
P.S.Я больше директив и классов боюсь =) Пока толком не подошел ни к чему.


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 03.04.2012 18:30 by packa.)
03.04.2012 18:25
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #122

(03.04.2012 17:08)Efrit Wrote:  Ну и чем твой получившийся код лучше моего? Ab
одной точкой выхода
(03.04.2012 17:08)Efrit Wrote:  Тебе приводится вводить не только дополнительную переменную
одна переменная в 4 байта ничего не решает.
(03.04.2012 17:08)Efrit Wrote:  но и целый двумерный массив
у тебя он тоже есть, хоть и занимает немного меньше места. и его существование не очевидно.
(03.04.2012 17:08)Efrit Wrote:  кстати, нафига он static?
чтобы существовал после выхода из функции
(03.04.2012 17:08)Efrit Wrote:  и всё лишь ради того, чтобы избежать дублирования return-ов.
ты поставил задачу - я ее выполнил. нечего ставить задачи в отрыве от контекста
(03.04.2012 17:08)Efrit Wrote:  Мне же проще использовать shared_ptr - и создавать ВСЁ в стеке, не парясь про утечки памяти при return-ах.
мне же проще использовать сборщик мусора и создавать ВСЁ в куче, не парясь про утечки памяти при чем-угодно.
(03.04.2012 17:08)Efrit Wrote:  в то время как ты узнаешь об ошибке лишь тогда, когда пользователь доберётся до критичной строчки кода.
в отладочной (а может и не только) сборке программа скажет в какой строке какого файла произошло исключение и покажет стек вызовов. более того, в режиме отладки среда отловит исключение и перенесет меня к той строке кода, которая его вызвала.
(03.04.2012 17:08)Efrit Wrote:  К тому же - сейчас, даже если вписать на место unsigned-переменной просто int-переменную (не обязательно константу) - то нормальные компиляторы всегда выдадут варнинг.
ты этого никогда не сделаешь в силу своих правил выбора типов переменных. так и кто-либо другой не выберет беззнаковый тип из-за отсутстия у него этих правил. более того, через отрицательный индекс можно реализовать дополнительную функциональность, например доступ к элементу с конца массива.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
03.04.2012 18:29
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #123

Quote:Ну так switch-то ты в итоге никуда и не дел
Переключатель - структурная конструкция и может быть развёрнута в if-elsif-else-end.

Quote:Так я же говорил про свой класс "массива", а не про "встроенные" обероновские массивы... В C++ я увижу подобную ошибку уже при компиляции, а в Обероне - лишь при исполнении.
Отрицательный константный индекс будет запрещён при компиляции.
Наличие знаковых типов ведёт к неизбежным преобразования знаковых к беззнаковым. То есть int и uint - числа из разных плоскостей. Избыточная сложность изучения, применения и использования при работе более одного автора проигрывает простому решению в стиле Калашникова.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
03.04.2012 18:38
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #124

(03.04.2012 18:20)Efrit Wrote:  Ну так switch-то ты в итоге никуда и не дел Ab
так он и не противоречит единственности точки выхода
(03.04.2012 18:25)packa Wrote:  Что происходит при присвоении kakoy_to_massive[5]? Ведь ее как бы не существует, сама создается? (или переходит снова на 0 элемент, затирая старое значение?)
нет, ты обращаешься к левой памяти (в данном случае ты попал на допустимый адрес, но в реальности не все 2 ГБ виртуальной страницы имеют свой физический аналог и ты также легко мог бы попасть на несуществующий адрес и получил бы что-то типа "память не может быть "written"").
(03.04.2012 18:25)packa Wrote:  P.S.Я больше директив и классов боюсь =)
ну там все проще


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
03.04.2012 18:38
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #125

packa Wrote:Что происходит при присвоении kakoy_to_massive[5]? Ведь ее как бы не существует, сама создается? (или переходит снова на 0 элемент, затирая старое значение?)
Ты пытаешься обратиться к &kakoy_to_massive[4] + sizeof(int) адресу памяти. В данном случае тебе повезло, но в реальности по этому адресу может лежать всё что угодно.

packa Wrote:Я больше директив и классов боюсь =)
Каких ещё "директив" - компиляторных, что ли? Их и не нужно всё помнить, лишь с десяток самых распространённых. На классы пока забей - лучше вначале хорошо выучи "чистый" С, без "плюсовых" фич.


gamecreator Wrote:одной точкой выхода
Спасибо, кэп. Я про читабельность говорил.

gamecreator Wrote:у тебя он тоже есть, хоть и занимает немного меньше места. и его существование не очевидно.
Неправда, у меня никакого двумерного массива нету. Из всех char-строчек типа "Zero" инициализируется лишь одна - та, что и будет в итоге возвращена.

gamecreator Wrote:чтобы существовал после выхода из функции
Это я знаю. Я не понимаю, зачем ему "после выхода из функции" нужно существовать 118

gamecreator Wrote:мне же проще использовать сборщик мусора и создавать ВСЁ в куче, не парясь про утечки памяти при чем-угодно.
Это не "сборщик мусора" - это ты, наоборот, руками всё убираешь. Я и не говорю, что это плохо (сам так постоянно делаю), но при громоздкой классовой структуре для меня проще работать со смарт-пойнтерами.

gamecreator Wrote:в отладочной (а может и не только) сборке программа скажет в какой строке какого файла произошло исключение и покажет стек вызовов. более того, в режиме отладки среда отловит исключение и перенесет меня к той строке кода, которая его вызвала.
А причём тут отладка? Ведь всё равно нет 100% гарантии того, что в ней тебе удастся создать такую ситуацию, при которой исполнится незаметная на первый взгляд, но критичная строчка. Придётся писать юнит-тесты, в то время как компилятор даст тебе 100% уверенность в своей правоте.

gamecreator Wrote:более того, через отрицательный индекс можно реализовать дополнительную функциональность, например доступ к элементу с конца массива.
Дык и я смогу. У меня здесь просто будет варнинг, но я его пропущу. Я же и не говорю, что варнинг - это плохо...


Berserker Wrote:Отрицательный константный индекс будет запрещён при компиляции.
Кем запрещён? С какого это перепугу, кто-то запретит указывать мне отрицательный индекс в операторе "квадратных скобок" в моём собственном классе?


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
03.04.2012 19:14
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #126

В Обероне. И там нет перегрузки операторов.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
03.04.2012 19:21
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #127

Плохо, что нету - это очень удобная штука.

Да даже и без перегрузки. Вот пример на C++: (Click to View)
   
Как видно - никаких сложностей, ошибка будет обнаружена сразу. А что в Обероне будет? Rolleyes Ведь в нём в сигнатуре функции get_value_of_array должен стоять int...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
03.04.2012 19:46
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #128

Там будет ловушка на этапе выполнения.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
03.04.2012 20:25
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #129

Вот видишь - на этапе выполнения. А некоторые ошибки на этапе выполнения хрен отловишь, в то время как ошибки при компиляции видны сразу.
Поэтому unsigned - это гуд. И чего в нём такого "сложного", мне решительно непонятно.


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
03.04.2012 20:29
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #130

(03.04.2012 19:14)Efrit Wrote:  Я про читабельность говорил.
компактность, прозрачность.
(03.04.2012 19:14)Efrit Wrote:  Неправда, у меня никакого двумерного массива нету. Из всех char-строчек типа "Zero" инициализируется лишь одна - та, что и будет в итоге возвращена.
но они-то все равно в памяти хранятся все. вот если бы ты это через шаблон делал - тогда да, одна строка.
(03.04.2012 19:14)Efrit Wrote:  Я не понимаю, зачем ему "после выхода из функции" нужно существовать 118
чтобы возвращаемый указатель указывал на строку, а не на мусор
(03.04.2012 19:14)Efrit Wrote:  Это не "сборщик мусора" - это ты, наоборот, руками всё убираешь. Я и не говорю, что это плохо (сам так постоянно делаю), но при громоздкой классовой структуре для меня проще работать со смарт-пойнтерами.
спасибо, я знаю, что в с++ нет сборщика мусора. к сожалению Bad
(03.04.2012 20:29)Efrit Wrote:  Поэтому unsigned - это гуд. И чего в нём такого "сложного", мне решительно непонятно.
никто и не говорил, что в нем "что-то сложное"


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
03.04.2012 21:07
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6183
Post: #131

gamecreator Wrote:чтобы возвращаемый указатель указывал на строку, а не на мусор
Ну ё-моё. Да не нужен там никакой static Ab Ты ведь производишь копирование для указателя result, созданного в куче... Не веришь мне - запусти код без static и убедись.

gamecreator Wrote:спасибо, я знаю, что в с++ нет сборщика мусора. к сожалению
Тогда не стоит писать "мне же проще использовать сборщик мусора и создавать ВСЁ в куче" Rolleyes

gamecreator Wrote:никто и не говорил, что в нем "что-то сложное"
Как это "никто"? Берс это говорил, прямым текстом...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
03.04.2012 22:21
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #132

(03.04.2012 22:21)Efrit Wrote:  Ты ведь производишь копирование для указателя result, созданного в куче...
где там куча? куча не используется
(03.04.2012 22:21)Efrit Wrote:  Не веришь мне - запусти код без static и убедись.
хм... интересно, я думал код будет транслироваться по-другому.
(03.04.2012 22:21)Efrit Wrote:  Тогда не стоит писать "мне же проще использовать сборщик мусора и создавать ВСЁ в куче" Rolleyes
так мне же проще на c# писать, чем на с++
(03.04.2012 22:21)Efrit Wrote:  Как это "никто"? Берс это говорил, прямым текстом...
а, точно. ничего сложного в изучении нет, здесь согласен


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
03.04.2012 22:43
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #133

А при проектировании интерфейсов, структур и функций есть. Если использована int, то uint не подходят. Если uint, то любое int-рассчитанное значение не подходит. При сравнении/присваивании нужны либо проверки времени исполнения, либо потеря безопасности.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
03.04.2012 22:52
Find all posts by this user Quote this message in a reply
gamecreator Offline

Posts: 7107
Post: #134

не всегда. если значения укладываются в диапазон от 0 до 231-1, то разницы нет.


When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
03.04.2012 23:55
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16471
Post: #135

И как это проверить? Проверками времени исполнения.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
04.04.2012 00:05
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group