![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
admsasha |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
есть код
компиляция удачно проходит, но выдается:
что нужно сделать что бы это исправить ? как правильно написать данную функцию ? |
||||
|
|||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Так нельзя!
Вот, так можно, но потом не забыть delete
|
|||
|
||||
admsasha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
delete где должна стоять ? |
|||
|
||||
Artiom |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1031 Регистрация: 11.3.2003 Где: Минск\Баку Репутация: нет Всего: 17 |
Надо передовать строку как параметр через указатель. Какой тебе толк в адресе локальной переменной?
-------------------- Если тебя жизнь трахает, значит, ты ещё живой |
|||
|
||||
admsasha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
мне надо просто вывод результата функции... и больше нечего
per1=proba(); |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
"просто вывод" замешивает аллокацию памяти.
если хочешь правильней делать, то аллоцируй над функцией, и передавай указатель. функция в него чего-нить впишет. вообще, старайся не скрывать аллокацию памяти, потом легче жить будет. добавляю файл... посмотри. Это сообщение отредактировал(а) bilbobagginz - 18.4.2005, 14:59 Присоединённый файл ( Кол-во скачиваний: 8 ) ![]() -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
есть еще один вариант
дописать static к объявлению локальной переменной получится нечто вроде глобальной переменной, только видно ее будет только из функции есть недостаток при каждом вызове функции старое значение будет стираться если приведенный пример полностью отображает ситуацию - можно использовать если реально поведение функции будет сложнее, тогда надо будет это учитывать... -------------------- qqq |
|||
|
||||
admsasha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
А мне и не надо, что бы сохранялось старое значение... даже наоборот нужно что бы новое писалось !
Или я неправильно это понимаю ?? вот допустим функция rnds
код так просто набрал... т.е. мне не надо что бы при использовании кокой либо части программы менялось первое значенение... Это сообщение отредактировал(а) admsasha - 19.4.2005, 08:11 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
я имел в виду такое:
после таких операций p будет равно pp, а значит, указывать они будут на одну и ту же строку... -------------------- qqq |
|||
|
||||
GrayCardinal |
|
||||||||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 2 Всего: 58 |
admsasha
Извини, тебя кто учил программить на Си ? Руки тому поотрывать ![]()
Нельзя возвращать указатель на переменную, которая у тебя лежит в стэке функции. При выходе из функции не факт что стэк не затрется (об этом и предупреждение компилятора. Там надо например
Добавлено @ 15:21
и часто ты так извращаешься ? Добавлено @ 15:23
По-моему человеку в FAQ в раздельчик - Си для чайников. Это сообщение отредактировал(а) GrayCardinal - 21.4.2005, 15:24 |
||||||||
|
|||||||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
тов. Кардинал... тебя самого на Си блин кто new писать учил ?
![]() в Си нету "new" и "delete", есть malloc(),calloc(), realloc(), brk(),sbrk() и free(). -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 2 Всего: 58 |
bilbobagginz
Не надо, я в курсе. Но по сравнению с тем, что ему предложили... ![]() ![]() ЗЫ И не надо сокращать мой творческий псевдоним. Добавлено @ 15:45 ЗЫЫ, а вообще я и daemon () знаю, меж прочим ![]() |
|||
|
||||
Fire-Plug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
admsasha
Неплохо было бы четко сформулировать, что должно в принципе происходить в твоей ф-ции. Если нужно, чтобы ф-ция возвращала char *, то все возможные решения тебе уже были предложены, а именно, 1) вернуть указатель на динамич. массив, созданный в теле ф-ции (bel_nikita). 2) вернуть указатель на статич. массив, объявленный в теле ф-ции (maxim1000). 3) вернуть указатель на локальный массив, объявленный вне тела ф-ции, к-рый передается в ф-цию как параметр (Artiom). А вообще, тебе следовало бы еще раз обратиться к определениям понятий о видимости и времени жизни переменных различных классов памяти в С/С++. --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
admsasha |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
т.е. если функция отдает каждый раз разные данные, то p и pp будут меняться ???? т.е. всегда иметь одно и тоже значение ? Вот как раз мне это и не надо ! мне надо что по нормальному все делалось {как же я не навижу все эти ссылки}... т.е. каждый вызов нечего не менял нигде, а записывал результат в char[100]; Это сообщение отредактировал(а) admsasha - 24.4.2005, 17:00 |
||||
|
|||||
chipset |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Данные то она отдает разные но значение указателя одинаковое, ибо static char. Добавлено @ 17:04
Тогда нафига тебе вообще что-то возвращать? ![]() --------------------
|
||||||
|
|||||||
admsasha |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
так я не понял, p и pp одинаковые значение имеет или нет ?
что бы получить результат, только в одну переменную не во всех переменных которые вызывали эту функцию |
||||
|
|||||
chipset |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Да. Потому что ты возвращаешь значение указателя а оно у тебя одинаковое всё время, static оно..
Fire-plug уже ответил тогда ![]() --------------------
|
||||||
|
|||||||
admsasha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
при этом, будет каждый вызов будет независемый ? т.е. каждый char[100]=proba(); будет получать свои данные, и не менять даже при выдачи функцией разные данные ? |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Вроде бы да
![]() --------------------
|
|||
|
||||
admsasha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
ну всё, всем спасибо... сознаюсь что не доконца все понял, но буду делать так как написал, мож дойдет когда либо...
рад что есть форумы, где можно получить ответ на заданный вопрос, а не получить мат в свою стороны, за его использование ![]() |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
А что собственно непонятного?
![]() Так как ты написал в самом начале - память выделяется на стеке функции, это значит что переменная самоуничтожится при выходе из области - конце функции. Так как написали - память выделяется из кучи, что означает то, что память не уничтожится пока ты явно это не сделаешь. --------------------
|
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
кстати, совсем забыл
есть еще такой метод:
![]() не буду нарушать традицию - у него тоже есть недостаток ![]() вот такое лучше не писать:
т.к. строки, которые пишутся в тексте программы в кавычках, компилятор автоматически записывает в отдельную область памяти, в которую лучше не писать но если результат функции нужен только для чтения - самый простой способ ![]() -------------------- qqq |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Так почему же тогда просто не объявить ее с сигнатурой const char*, чтобы избежать такой ситуации? ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
просто изначально в вопросе был пример без модификатора const -------------------- qqq |
|||
|
||||
Fire-Plug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Все обсуждения даной темы не имеют смысла, покуда задавший вопрос не поймет, что ему собственно нужно, т.к. создается впечатление, что все вышеприведенные рекомендации лично автора вопроса не удовлетворили.
Кто-то может дать определение, что такое "независимый вызов"? ЗЫ: Фраза явно напрашивается, чтобы ее передали С.Альтову (или М.Задорнову, или А.Иванову) для размешения в рубрике "Что бы это значило". --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
chipset |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Разьясняю.
Это обозначает то что значение последующих вызовов не будет зависимо от предыдущих. ![]()
Уважаемый, если вы не поняли вопроса - это не значит что люди не имеют права обсуждать то что им интересно.
Надо будет ему сообщить. --------------------
|
||||||||
|
|||||||||
Fire-Plug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Не люблю примитивной отсебятины. Для интереса попробуй найти аналогию своему "определению" хотя бы на И-нете. А также найти пример "зависимых вызовов ф-ций". Возьмем, любую ф-цию, ну, например, CRTL ф-цию strlen(). В каком случае результат ее вызова будет зависеть от предыдущих вызовов, а в каких нет? --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
chipset |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Рекомендую прочитать ещё раз тему.
--------------------
|
||||||
|
|||||||
admsasha |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 28.1.2005 Репутация: нет Всего: 6 |
strtok, следующие результаты, могут зависеть, от предыдущих |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |