[Закрыть]
 
popoff.donetsk.ua
Если долгое время ходить в маске, рано или поздно можно так сжиться с ней, что потеряешь своё истинное лицо.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Основы программирования и алгоритмические языки - Моделирование строк с помощью указателей. Инициализация строк.

Моделирование строк с помощью указателей. Инициализация строк.

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1697
Моделирование строк с помощью указателей. Инициализация строк.

Доброго времени суток, Юрий Васильевич! Воспользуюсь декларированным Вами правом задать вопрос. Хочу заверить, что Вы - последняя инстанция, и что мои затруднения - не есть следствие нежелания делать что-то самой. Ну, собственно, сам вопрос:
Есть глобальная переменная char *s;
И локальная переменная - результат действия функции - строка char *s1;
Так вот, когда я пишу strcpy(s,s1), то результатом распечатки переменной s есть Null. Выделение памяти под все переменные положительно не влияет. Я совершенно не понимаю, что происходит, потому что для целых чисел мне эта операция вполне удавалась, так же, как и собственно функция копирования строки в новую переменную(в пределах одной функции).

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1698

Frazy,
1. Я был бы рад узнать, что именно Вы уже делали. Если Вам это не сложно, то как можно подробнее, по пунктам.
2. Без конкретного программного кода я на Ваш вопрос ответить не смогу. Пожалуйста, приведите здесь неработающий фрагмент программы.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1699
char *str="-12-34-56-7-890"; char *s3; .... char f1(char *str) { char *s1,*s="0"; while (strlen(*str)) {   if (*str=='-')    {    strncat(s1,str,1);    strncat(s1,str+1,1);    }    str++; }    strncat(s1,s,1);   printf("%s\n",s1);/*печатает "-1-3-5-7-80"*/   strcpy(s3,s1);   printf("%s\n",s3);/*печатает Null*/   return(s3); } main() {   clrscr();   f1(str);   getch(); }

вот этот Null мне и не понятен.

Это сообщение было отредактировано popoff 06.12.06 20:25.
popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1700

1. Проверьте, все ли предупреждения включены в Вашем компиляторе? Если Вы пользуетесь TC v2.0, то они включаются в меню Options - Compiler - Errors - (и дальше четыре последних пункта - везде должно быть On). Если где-то Off, то переключите на On. Если у Вас другой компилятор - поищите по пунктам меню.

2. Перекомпилируйте Вашу программу.

3. Если в какой-то строчке возникнет ошибка или предупреждение, то укажите здесь, пожалуйста, текст той ошибки или предупреждения и в какой строчке эта ошибка возникла.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1701

Доставила недостающие галочки.
А как посмотреть предупреждения, если ошибок нет?

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1702

Предупреждения выводятся там же, где и ошибки.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1703

Ошибок нет и предупреждения не видны. Может, не настроено?
Я специально сделала ошибку и посмотрела предупреждения:
Строка while (strlen(*str))- non-portable pointer conversion
Строка return(s3); - non-portable pointer conversion
Все, в этой функции больше предупреждений нет.

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1704

Должны быть ещё предупреждения. Ещё как минимум несколько. Скорее всего, Вы какие-то галочки не доставили. Проверьте ещё раз всё внимательно.

Для перекомпиляции нужно что-нибудь изменить в программе. Я, например, добавляю и удаляю в любом месте пробел и после этого перекомпилирую. Если ничего не менять, то компилятор считает, что код не менялся и не перекомпилирует - выводит Вам окно, в котором написано is up to date.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1705

Может быть, надо выложить всю программу? Проверила еще раз. На эту функцию больше нет предупреждений. Их вообще мало, хотя «оn» стоит везде.

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1706

А вот эту функцию f1 - Вы полностью выложили? Дело в том, что внутри этой Вы считываете значение переменной, в которую перед этим ничего не записывали. Компилятор должен ругаться на соответствующую строчку.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1707

Если бы мне выдавалась ошибка, я бы к Вам не обращалась. Увы. Программа работает. Но неправильно!

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1708

Выложите, пожалуйста, вот здесь:
http://popoff.donetsk.ua/file/upload/
экранные формы всех тех настроек, которые Вы изменили для включения показа всех предупреждений.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1709

Меня, к сожалению, уже отлучают от Интернета, я смогу продолжить разговор только завтра, если Вам ещё не надоело возиться с «чайниками». Спасибо за терпение!

~~~~~ 5 Дек 2006, 15:35 ~~~~~

Добрый день, Юрий Васильевич!
Я пришла домой и дома компилятор показал мне нужную ошибку.:) Действительно, при применении макроса strcat(strncat), строка должна быть инициализирована.  Но дело в том, что неинициализированная s1 считается правильно, инициализированная - нет. И наоборот, несмотря на то, что при использовании strcpy(stpcpy) переменная не обязательно должна быть инициализирована, в инициализированной s3 появляется значение.

~~~~~ 5 Дек 2006, 17:00 ~~~~~

И еще одна загадка.
При вызове f1(str);
           f2(s3);
нормально приходит ответ, а при вызове
           f2(f1(str)) компилятор просто «вылетает». Но ведь s3 - это и есть результат f1! В чем же дело?

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1712

Frazy,
Вы забыли сказать, какую ошибку, в какой строке, как Вы её исправили, а также как Вы инициализировали эти переменные.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1714

Компилятор говорит, что возможно s1 используется до определения. Но, увы, если ему присвоить какое-то значение(даже пустое или пробел), то получается неверный ответ. А если выделить память, то компилятор не ругается, но пишет много «мусора»! Меня вообще в этой программке преследует «мусор». Возможно, и компилятор вылетает из-за этого?

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1715

Frazy,
Как Вы инициализировали переменную? Какое значение Вы присваивали? Что означает «присвоить пробел указателю»? Как Вы выделяли память?

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1716

Все, решено. Оказывается, надо было определить функцию как char *f1(char *str).Тогда она должна возвращать указатель на массив символов а не сам символ. Теперь все правильно работает, несмотря на то, что не было инициализации s1 и не была формально выделена память!

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1717

Frazy,
Вы не разобрались в вопросе. Попробуйте ввести строку подлиннее - и посмотрите результат. С большой долей вероятности результат будет неправильным.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Frazy
Frazy
Дек, 2006
Сообщений: 15
Frazy url://forum.message:1718

Ввела подлиннее. Печатает ответ в две строки. Правильно!

~~~~~ 6 Дек 2006, 18:24 ~~~~~

Зато Вам будет, что спросить у меня на лабораторных!:)Нет, к сожалению,времени - так затянула с этой программкой. Я думаю, мы обсудим это чуть позже!

popoff
Yuri
Июл, 2004
Сообщений: 944
popoff url://forum.message:1719

Если лабу эту буду проверять я, то с фрагментами, подобными тому, который Вы опубликовали, пусть даже с предложенными Вами исправлениями, эту лабу я зачесть не смогу. Приготовьтесь к тому, что я попрошу Вас на бумаге расписать побайтово всю память: в каких байтах памяти какие переменные хранятся, какие в них значения, какие байты памяти занимают одни строки, какие - другие. Какая память и где выделяется.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Обмен электронных валют
money.dn.ua