Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> private member declared in class std::basic_ios<_E, при передаче файловой переменной в ф-ю 
V
    Опции темы
mes
Дата 21.12.2008, 15:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  15:05 Найти цитируемый пост)
Только странно называть самый обычный список стеком... 

стек отличается от других видов контейнера тем, что у него есть доступ только к верхним/нижним элементам.
фактически стек является адаптером над контейнером, ограничивая его для придания нужно интерфейса.

Цитата(KasMP @  21.12.2008,  14:49 Найти цитируемый пост)
У нас нет классов. 

ну тогда класс - это структура данных с набором функций для нее.

Цитата(KasMP @  21.12.2008,  14:49 Найти цитируемый пост)

Ой, а что это ты ко мне на "вы" smile  smile ...

так получилось .. сам не заметил.. привычка  smile 

Цитата(KasMP @  21.12.2008,  14:49 Найти цитируемый пост)
Чем отличается?? Тем, что потоки буферизованы?

Нет. Тем что за потоком не стоит определенного устройства, точнее сказатьи мы не знаем что там на самом деле.
То есть поток сам решает как оптимально использовать то устройство, которое он скрывает. 




--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Ну а теперь моя любимая программка при самом обычном присвоении целочисленной переменной значения выдает ошибку:

user posted image


Код
t=int(present1->c)+int(present2->c)+mental-96;
Указатели смотрят куда надо, mental инициализирована...

Я совсем не знаю, что думать (строчка с номером 10):
Код

// в первом стеке больше элементов, чем во втором
char *Addition (stack *h1, stack *h2, char *res)
{
    int mental=0, t, len=strlen(res);
    stack *present1=h1, *present2=h2;

    while (present2!=NULL) {
         t=int(present1->c)+int(present2->c)+mental-96;
         *(res+len-1)=t%10+48;
         
         len--; mental=t/10;
         present1=present1->next; delete h1; h1=present1;
         present2=present2->next; delete h2; h2=present2;
         }

    while (present1!=NULL) {
         t=int(present1->c)+mental-48;
         *(res+len-1)=t%10+48;
         
         len--; mental=t/10;
         present1=present1->next; delete h1; h1=present1;
         }

    delete h1; delete h2;
    
    if (mental==1) *res='1'; else *res=' ';

    return(res);
}

PM MAIL   Вверх
mes
Дата 21.12.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



прежде всего откуда удаление ?
Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
    delete h1; delete h2;
это этически некоректно удалять в процедуре то, что в ней не создано (за исключением случаев, когда функция явно для этого предназначена) и судя по всему явно не это ожидалось.

во вторых почему в функцию сложения передается стек ??



Это сообщение отредактировал(а) mes - 21.12.2008, 17:01


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  16:58 Найти цитируемый пост)
прежде всего откуда удаление ?

Я удаляю числа предыдущего разряда, который уже сложен и, соответственно, больше никогда не потребуется.
Цитата(mes @  21.12.2008,  16:58 Найти цитируемый пост)
это этически некоректно удалять в процедуре то, что в ней не создано (за исключением случаяв когда функция явно для этого предназначена)
Я об этом думала.
Победила такая мысль: если не удалять здесь, то тогда придется создавать еще одну процедуру для удаления и снова проходить по тем же самым ссылкам по второму кругу.
Цитата(mes @  21.12.2008,  16:58 Найти цитируемый пост)
во вторых почему в функцию сложения передается стек ??

Эмм... В смысле??
Я передаю указатели на начало списков (где самые первые разряды) и указатель на строку-результат. Потом иду по списку, складываю (и удаляю уже сложенное)...
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
int(present1->c)+int(present2->c)+mental-96;

это называется использованием магических чисел и такой подход очень плох.
лучше так:
int(present1->c-'0')+int(present2->c-'0')+mental;



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Ошибка на 10-ой строке, до удаления даже не доходит...

Добавлено через 1 минуту и 5 секунд
Цитата(mes @  21.12.2008,  17:06 Найти цитируемый пост)
это называется использованием магических чисел и такой подход очень плох.
лучше так:
int(present1->c-'0')+int(present2->c-'0')+mental;

Спасибо большое. Так правда намного лучше и понятнее smile  smile .
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:05 Найти цитируемый пост)

Эмм... В смысле??
Я передаю указатели на начало списков (где самые первые разряды) и указатель на строку-результат. Потом иду по списку, складываю (и удаляю уже сложенное)... 

Сложение (сам механизм) не должно быть реализовано в функции работающей со стеком. Разделите функционал на смысловые части.. Именно поэтому я предлагал начать с класса
(читать: описания) "длинной" переменной.

Добавлено через 1 минуту и 12 секунд
Цитата(KasMP @  21.12.2008,  17:06 Найти цитируемый пост)
Ошибка на 10-ой строке, до удаления даже не доходит...

Пока не знаю до чего доходит.. но глаз режет.. поэтому и высказал  smile 


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Да, кстати, без этого эту функцию смотреть бесполезно:
Код

struct stack {char c; stack *next;};

PM MAIL   Вверх
mes
Дата 21.12.2008, 17:16 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
char *Addition (stack *h1, stack *h2, char *res)

1. Передаются два стека, а результат весь умещается в одну строку ?
2. а на какой длины буффер указывает res ?

Цитата(KasMP @  21.12.2008,  17:12 Найти цитируемый пост)
Да, кстати, без этого эту функцию смотреть бесполезно:

это не стек, это  список

Это сообщение отредактировал(а) mes - 21.12.2008, 17:19


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:11 Найти цитируемый пост)
Сложение (сам механизм) не должно быть реализовано в функции работающей со стеком. 

По идее, да.
Цитата(mes @  21.12.2008,  17:11 Найти цитируемый пост)
Разделите функционал на смысловые части..

Надо бы, конечно... Но там получится такая мааааааленькая функция, в которую придется много всего передавать.
Как-то странно такой маленькой функции отводить так много памяти и "передаваний".
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:18 Найти цитируемый пост)
Надо бы, конечно... Но там получится такая мааааааленькая функция, в которую придется много всего передавать.
Как-то странно такой маленькой функции отводить так много памяти и "передаваний". 

неправда, для сложения требуется два аргумента, и сумма как результат.  smile 

Это сообщение отредактировал(а) mes - 21.12.2008, 17:22


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:16 Найти цитируемый пост)
это не стек, это  список

Я знаю и говорю про это с самого начала!!!!!!
Цитата(mes @  21.12.2008,  17:16 Найти цитируемый пост)
1. Передаются два стека, а результат весь умещается в одну строку ?

Ну а почему бы и нет? Взяли число из первого "стека", взяли число из второго, сложили, получили число в res.
Цитата(mes @  21.12.2008,  17:16 Найти цитируемый пост)
2. а на какой длины буффер указывает res ?

На один символ больший, чем длиннейшее число (чтобы вошла единичка, если, например, 999+2=1001).

Добавлено через 2 минуты и 11 секунд
Цитата(mes @  21.12.2008,  17:20 Найти цитируемый пост)
неправда.  

Что именно? То, что это странно или то, что ей можно передать меньше, чем я предполагаю?
(а я предполагаю mental, один из указателей на "стек", и указатель на нужную позицию в  res)

Добавлено через 3 минуты и 7 секунд
Ну а если я поделю, то суть прораммы все равно не изменится и ошибка будет так же вылетать...

Добавлено через 6 минут и 22 секунды
А вот главная функция. Пусть будет smile :
(она пока не закончена: вывода в файл нет, файлы не закрыты и т.п.; но это не так важно...)

Код

int main()
{
    stack    *h1, *h2;
    ifstream f1(path1); ifstream f2(path2); ofstream fout(pathout);
    
    int i;
    char *s1, *s2, *res;
    
    s1=new char[]; s2=new char[];

    char *esc=new char[];

    //while ((!f1.eof()) && (!f2.eof()))
    {
        f1.getline(s1,MAX,' '); f2.getline(s2,MAX,' ');
        printf("s1=%s.\n", s1); printf("s2=%s.\n", s2);
        int len1=strlen(s1), len2=strlen(s2);
        if (len1>len2) {
            res=new char[len1+1];
            esc=Addition(h1,h2,res);
        } else {
            res=new char[len2+1];
            esc=Addition(h2,h1,res);
        }
    }

    printf("res=%s\n", esc);

    
    return(0);
}

PM MAIL   Вверх
mes
Дата 21.12.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
Я знаю и говорю про это с самого начала!!!!!!

ну а исправлять когда будем ?!  smile 


Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
Ну а почему бы и нет? Взяли число из первого "стека", взяли число из второго, сложили, получили число в res.

дело не в том что делает функция, а в том как выглядит ее объявление.. 
Лично я воспринимаю что такая функция должна сложить два стека,а не определенные его элементы.

Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
На один символ больший, чем длиннейшее число (чтобы вошла единичка, если, например, 999+2=1001).

покажи как все это  происходит.

Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
Что именно? То, что это странно или то, что ей можно передать меньше, чем я предполагаю?
(а я предполагаю mental, один из указателей на "стек", и указатель на нужную позицию в  res) 

Цитата(mes @  21.12.2008,  17:20 Найти цитируемый пост)
для сложения требуется два аргумента, и сумма как результат

и ни о каких стеках речи нет.


Это сообщение отредактировал(а) mes - 21.12.2008, 17:31


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:20 Найти цитируемый пост)
неправда, для сложения требуется два аргумента, и сумма как результат.

Неправда smile  smile !
Во-первых, у меня аргументов не всегда 2 (можно сделать и всегда 2, конечно... но наврядли производительность от этого выиграет).
Во-вторых еще есть mental... Его тоже надо помнить и перезапоминать при сложении каждого разряда.

Добавлено через 2 минуты и 38 секунд
Цитата(mes @  21.12.2008,  17:30 Найти цитируемый пост)
покажи как все это у  происходит.

Соответствующий кусочек main():
Код

        f1.getline(s1,MAX,' '); f2.getline(s2,MAX,' ');
        int len1=strlen(s1), len2=strlen(s2);
        if (len1>len2) {
            res=new char[len1+1];
            esc=Addition(h1,h2,res);
        } else {
            res=new char[len2+1];
            esc=Addition(h2,h1,res);
        }

Цитата(mes @  21.12.2008,  17:30 Найти цитируемый пост)
и ни о каких стеках речи нет.

Ну, ты называешь аргументом символ, я называю указатель на символ smile ...
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
Неправда smile  smile !
Во-первых, у меня аргументов не всегда 2 (можно сделать и всегда 2, конечно... но наврядли производительность от этого выиграет).
Во-вторых еще есть mental... Его тоже надо помнить и перезапоминать при сложении каждого разряда. 

Вот тебе (не программе) сказали что надо сложить два числа. Tебе кто-то должен передавать ментал ?
Вот подумай как бы ты решила такое задание и объясни компу.  smile 


Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
у меня аргументов не всегда 2 

В смысле бывает и меньше ?? Ну ка сложи мне 1 и .. не.. не так...  сложи 1.  Логично, а ?



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.