TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« : Ноябрь 25, 2007, 10:02:40 » |
|
Loaded 'ntdll.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found. Loaded 'G:\Program Files\Agnitum\Outpost Firewall\wl_hook.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found. Loaded 'C:\WINDOWS\system32\imm32.dll', no matching symbolic information found. Как исправить ? Переставить ОС не выход из ситуации =\ З.Ы. Темы по типу такой как я создал не нашел. ( Отправлено в: Ноября 25, 2007, 18:48:11) Код любой ... пробывал даже просто #include<stdio.h> void main (){ printf("dwdaww"); } выдает ошибку эту ( Отправлено в: Ноября 25, 2007, 19:28:17) Microsoft Visual C++ 6.0 ХП Проф СП2 ( Отправлено в: Ноября 25, 2007, 19:44:47) Просто все нормально работало, ничего не делал с этими файлами, а начало выдавать ошибку =\ От чего может такое произойти ? На будущее просто чтоб знать ... (Отправлено в: 25 Ноября 2007, 19:10:02)#include<stdio.h> #include<conio.h> #include<math.h> #include<stdlib.h> float *max(float *mas,int n,float sred){ int i,j; float max,maxo,*a; //всякие вычисления, потом *a=max; return (a); }
void main (){ float *mas,*a,sred,max,imax,jmax; int i,j,n; printf("vvedite n\n"); scanf("%d",&n); create(&mas,n); sred=sredarif(mas,n); [color=red]a=max(mas,n,sred);[/color] }
G:\Prog\lab\04\04.CPP(58) : error C2064: term does not evaluate to a function Ругается на строчку выделеную. Программа не полная, удалил функции, которые на 100% правильные, чтоб сильно большой не была. Написал программу поменьше для проверки перд этим, но без передачи данных. #include<stdio.h> #include<conio.h> #include<math.h> #include<stdlib.h> float *qwe(){ float *a,max=10; *a=max; return(a); } void main (){ float *a,n1; a=qwe(); n1=*a; printf("%f",n1); } Она работает. Не пойму в чем ошибка ...
|
|
« Последнее редактирование: Июль 28, 2008, 11:01:16 от artem90 »
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
Polyakov
Специалист
Карма: +12/-7
Offline
Сообщений: 164
|
|
« Ответ #1 : Ноябрь 25, 2007, 10:46:02 » |
|
float *max(float *mas,int n,float sred){ int i,j; float max,maxo,*a; //Some calculus, then *a=max; return (a); } Область жизни и видимости локальных переменных обычно программный блок. Говорю "обычно" потому что С++ посути дела является не совсем стабильным языком, выполнение программного кода которого зависит от многих факторов. В вашем случае Вы указателю присваиваете адрес локальной переменной *a=max; а потом пытаетесь вернуть переменную "а", которая одновременно является и переменной "max", которая по окончанию выполнения программного блока (функции "float *max(float *mas,int n,float sred)" ) автоматически освобождается в памяти ( то есть говоря более понятным Вам языком уничтожается). Получается что передается то, чего в момент передачи уже нет!! Кроме того имя функции "*max" и тут же имя описанной переменной в данном программном блоке "float max," !!! Никогда не перестаюшь удивлятся многообразию проявления абсурдных ситуаций которые пропускает компилятор С++.
|
|
« Последнее редактирование: Ноябрь 25, 2007, 11:15:36 от Романыч »
|
Записан
|
|
|
|
Alder
|
|
« Ответ #2 : Ноябрь 25, 2007, 10:59:56 » |
|
В вашем случае Вы указателю присваиваете адрес локальной переменной *a=max; а потом пытаетесь вернуть переменную "а", которая одновременно является и переменной "max", которая по окончанию выполнения программного блока (функции "float *max(float *mas,int n,float sred)" ) автоматически освобождается в памяти ( то есть говоря более понятным Вам языком уничтожается). Получается что передается то, чего в момент передачи уже нет!! Бред! Оператор return затем и используется, чтобы вернуть значение из функции. Он копирует значение переменной а в область памяти, отведенную для возвращаемого результата функцией max. Никогда не перестаюшь удивлятся многообразию проявления абсурдных ситуаций которые пропускает компилятор С++. Потому что в языке С/С++ головой должен думать программист, когда пишет небезопасный или непонятно как работающий код. Говорю "обычно" потому что С++ посути дела является не совсем стабильным языком, выполнение программного кода Язык на котором написаны ОС для военных компьютеров является не совсем стабильным? Язык, который является основным в мире системного программирования и на нем пишут даже под микроконтроллеры с 512 байт памяти является не совсем стабильным? Я удивлен.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #3 : Ноябрь 25, 2007, 11:05:02 » |
|
PolyakovС название функции действительно не заметил Идея состояла в том, что если структуры нельзя использовать, а надо передать сразу несколько значений из функции, записать переменные в область памяти на которую ссылается указатель... т е чтото типа такого *a=i; a++; *a=j; a++; *a=*(mas+i*n+j); потом передать указатель обратно в программу.... С этим разобрался ... работает, коректно или нет попоже проверю вручную Вот еще проблема появилась #include<stdio.h> #include<conio.h> #include<math.h> #include<stdlib.h> void create(float **mas, int n) { int i,j; *mas=(float*)malloc(n*n*sizeof(float)); randomize (); for (i=0;i<n;i++) { printf("\n"); for (j=0;j<n;j++) { *(*mas+i*n+j)=random(2001)-1000; printf("%.2f ",*(*mas+i*n+j)); } }
} G:\Prog\lab\04\04.CPP(8 ) : error C2065: 'randomize' : undeclared identifier G:\Prog\lab\04\04.CPP(13) : error C2065: 'random' : undeclared identifier Почему может не работать рандом ?
|
|
« Последнее редактирование: Ноябрь 25, 2007, 11:23:05 от KyDECHuK »
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #4 : Ноябрь 25, 2007, 11:08:21 » |
|
Polyakov, ошибка не в этом. Если в том месте, где стоит непонятный комментарий //а здесь всякие вычисления, будет корректно отводиться память под указатель * a, то присваивание разыменованному указателю и возврат return'ом его копии совершенно правомерен, что сказал Alder.
Что касается "абсурдных" ситуаций, то это не относится к данному случаю. Никто и ничто не мешает объявить внутри функции одноименную переменную. Но в результате мы не сможем использвать рекурсию, так как имя функции будет перекрыто и недоступно. Это нехорошо, программиста надо "бить по рукам" и учить, но это не ошибка.
А вот в функции main() переменная с именем max перекрыла функцию max(). И зря вы ругаете компилятор, он это не пропустил, о чем свидетельствует ошибка Visuall C++ C2064.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Alder
|
|
« Ответ #5 : Ноябрь 25, 2007, 11:10:37 » |
|
TARAKAN, undeclared identifier = неописано. Т.е. не может найти описание этой функции в подключенных модулях. З.Ы. RTFM З.Ы.Ы. Оформляй код правильно! Уже предупреждали.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
Polyakov
Специалист
Карма: +12/-7
Offline
Сообщений: 164
|
|
« Ответ #6 : Ноябрь 25, 2007, 11:16:07 » |
|
Бред! Оператор return затем и используется, чтобы вернуть значение из функции. Он копирует значение переменной а в область памяти, отведенную для возвращаемого результата функцией max Правильно копирует значение переменной, а в переменной "а" находится указатель адреса. Интересно какая у Вас была оценка по программированию? (Отправлено в: 25 Ноября 2007, 22:10:50)Polyakov, ошибка не в этом. Если в том месте, где стоит непонятный комментарий //а здесь всякие вычисления, будет корректно отводиться память под указатель * a, то присваивание разыменованному указателю и возврат return'ом его копии совершенно правомерен, что сказал Alder. В примере явно присутствует строчка *a=max; Поэтому о корректном выделении памяти под переменную "а" при данных примера нет и речи. А Alder пусть как говорят немного подучит матчасть.
|
|
|
Записан
|
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #7 : Ноябрь 25, 2007, 11:25:15 » |
|
AlderЯ понимаю, что неописанно, но рандом хранится в библиотеке stdlib.h она подключена #include<stdlib.h> у меня уже такое не первый раз ... иногда работает иногда нет Оформляй код правильно! Уже предупреждали. Пока печатал новое сообщение отправили новое, последнее поправил, остальные ввиду запрета на правку по времени, сам не могу поправить, Романыч сказал, что поправит, и это сделал : )) Создал *а в программе и передал в функцию, вроде работает правильно.
|
|
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #8 : Ноябрь 25, 2007, 11:28:34 » |
|
TARAKAN, ты используешь Visual C++, а в нем генерация случайных чисел не такая, как в старом досовском Turbo C или Borland C++. И функций randomize() и random() в stdlib.h этой среды нет, ибо они не относятся к кроссплатформенным. Так что меняя ОС и компилятор будь готов к тому, что их нет. Используй в VC++ функции void srand(unsigned int seed) и int rand(). Что-то вроде этого: #include <stdlib.h> #include <time.h> ... int main(void) { // Инициализируем генератор srand((unsigned) time(NULL));
/* Генерируем случайное число от 0 до RAND_MAX (по умолчанию от 0 до 32767) */ int randomNumber = rand();
}
Деля результат rand() на (double)RAND_MAX, можно нормализовать случайное число к 1, а затем поулчить число в нужном диапазоне. Дальше - сам... Тут хороший пример: http://msdn2.microsoft.com/en-us/library/398ax69y(VS.80).aspxИ вообще, если решил использовать для учебы изначально VC++, поставь и подружись с MSDN. И будет тебе счастье. Может быть
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Polyakov
Специалист
Карма: +12/-7
Offline
Сообщений: 164
|
|
« Ответ #9 : Ноябрь 25, 2007, 11:41:13 » |
|
Язык на котором написаны ОС для военных компьютеров является не совсем стабильным? Язык, который является основным в мире системного программирования и на нем пишут даже под микроконтроллеры с 512 байт памяти является не совсем стабильным? Я удивлен. Приготовьтесь к тому что в своей жизне Вам еще предстоит многому удивляться! Ведь недаром говорят "исскуство программирования". Одним это дано, другим нет. Одни мастера, другие - в лучшем случае подмастерья. Профессиональное программирование на С есть исскуство, потому что в данном семействе языков программирования имеется наибольшее количество подводных камней и реальное программирование здесь осуществляется что называется на гране фола. Зато если этим исскуством овладеть хотя бы близко к профессиональному уровню то программки получаются компактные, быстрые, но часто узконаправленные. За одни свойства нужно расплачиваться другими. (Отправлено в: 25 Ноября 2007, 22:38:15)TARAKAN, ты используешь Visual C++, а в нем генерация случайных чисел не такая, как в старом досовском Turbo C или Borland C++. И функций randomize() и random() в stdlib.h этой среды нет, ибо они не относятся к кроссплатформенным. Так что меняя ОС и компилятор будь готов к тому, что их нет. Используй в VC++ функции void srand(unsigned int seed) и int rand(). А если преподаватель попросит запустить данную программу, а VC++ в аудитории и не пахнет? Что тогда будем делать?
|
|
|
Записан
|
|
|
|
Alder
|
|
« Ответ #10 : Ноябрь 25, 2007, 11:42:48 » |
|
Правильно копирует значение переменной, а в переменной "а" находится указатель адреса. А это что-то меняет? Функции, возвращающие указатель, ничем не отличаются от функций, возвращающих обычные переменные. Единственный нюанс - тип возвращаемого указателя должен соответствовать типу, описанному в заголовке функции (ну и память само собой должна быть грамотно выделена, что верно сказал EvilMax) То, что TARAKAN не описал это выделение не означает, что так нельзя делать. Интересно какая у Вас была оценка по программированию? Если вас это так интересует, то 4. А Alder пусть как говорят немного подучит матчасть. Матчасть я привел правильно с учетом нюансов выделения памяти. По стандарту (жаль, не нашел полный стандарт С, но вполне сгодился справочник Шилдта для подтверждения того, что я знал) все будет так, как я написал выше.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
TARAKAN
Tifon
Бакалавр
Карма: +0/-0
Offline
Пол:
Сообщений: 134
|
|
« Ответ #11 : Ноябрь 25, 2007, 11:43:40 » |
|
Ясно, буду разбираться, просто не понравилась старая версия тем что там скопировать результат с экрана неполучается.... а в одной задаче матрица вышла за пределы экрана... а вариант изменять программу для записи результатов в текстовик не подошла т к нас этому просто еще не обучали.... Я так понял, что без MSDN мне не обойтись уж точно, буду качать ... Может Хорошое слово
|
|
« Последнее редактирование: Июль 28, 2008, 11:14:22 от artem90 »
|
Записан
|
Студент: По моему легче использовать printf... EvilMax: Зато cout - это тру! = ))
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #12 : Ноябрь 25, 2007, 11:46:39 » |
|
Программирование - не искусство. Это средство зарабатывания денег, ИМХО. Хотя, когда изучаешь какой-то раздел, хорошо бы к нему относиться как к искусству, быстрее научишься писать красивый и компактный код. Да и вырабатывается привычка хоть чуть-чуть оптимизировать его сразу, а не постфактум.
Что касается военных систем, я слышал замечания по поводу процессов разработки таких систем на C от друга, работающего в США. Детально изучаются все возможные и уже найденные ошибки и нестабильности компилятора. Потом пиештся код. А потом пишется _на порядок_ больше документации _только к коду_. Т.е. функция на пол-экрана может обрости несколькими страницами пояснений и примеров. А вообще, смотрим название темы и не оффтопим. Если нужно обсудить достоинства, недостатки C/C++ и стабильность компиляторов, начните новую тему.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Polyakov
Специалист
Карма: +12/-7
Offline
Сообщений: 164
|
|
« Ответ #13 : Ноябрь 25, 2007, 11:57:23 » |
|
А это что-то меняет? Функции, возвращающие указатель, ничем не отличаются от функций, возвращающих обычные переменные. Единственный нюанс - тип возвращаемого указателя должен соответствовать типу, описанному в заголовке функции (ну и память само собой должна быть грамотно выделена, что верно сказал EvilMax) То, что TARAKAN не описал это выделение не означает, что так нельзя делать. Возвращает - да. Возвращает указатель на ту, область памяти которая уже не доступна. То, что TARAKAN не описал это выделение не означает, что так нельзя делать. Можно и на потолке спать - да одеяло на пол падать будет.
|
|
|
Записан
|
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #14 : Ноябрь 26, 2007, 12:01:11 » |
|
Возвращает указатель на ту, область памяти которая уже не доступна. Если память выделена malloc или ей подобной функцией, то все будет нормально. Ведь выход из функции не освобождает специально выделенную память. *a=max; - тоже корректно, разыменовали и в выделенную память записали float. Потом вернули копию адреса. Если бы было a = &max;, то тогда да, была бы ошибка. Так как float max имеет внутри функции класс памяти auto и эта память будет освобождена. Но в коде такого нет.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Polyakov
Специалист
Карма: +12/-7
Offline
Сообщений: 164
|
|
« Ответ #15 : Ноябрь 26, 2007, 12:16:54 » |
|
Так как float max имеет внутри функции класс памяти auto и эта память будет освобождена. Но в коде такого нет. Как это "в коде такого нет"? float *max(float *mas,int n,float sred){ int i,j; float max,maxo,*a; //всякие вычисления, потом *a=max; return (a); }
|
|
« Последнее редактирование: Ноябрь 26, 2007, 12:33:19 от Романыч »
|
Записан
|
|
|
|
Alder
|
|
« Ответ #16 : Ноябрь 26, 2007, 12:20:25 » |
|
Polyakov, имелось ввиду вот это - "Если бы было a = &max;, то тогда да, была бы ошибка." В коде такого действительно нет.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #17 : Ноябрь 26, 2007, 12:23:50 » |
|
Polyakov, я не вижу взятия адреса локальной переменной. Разыменование указателя, под который не отведена память есть, это ошибка. А то, о чем вы говорили, нет. Смотрим подробно: float *max(float *mas,int n,float sred){ int i,j; float max,maxo,*a; //всякие вычисления, потом
/* Разыменовываем указатель и записываем в память значение типа float Это абсолютно корректно, если до этого где-то встретися a=(float*)malloc(sizeof(float)); Иначе - разыменовываем "мусор". И пишем данные "в космос". В Windows и Unix программа здесь должна "вылететь" */ *a=max; // Возвращаем копию адреса в программу. Все ОК, если указатель корректный return (a); }
То же, о чем говорите вы, и что касается уничтожения локальных переменных при выходе было бы так: float max,maxo,*a; a=&max; // Некорректно! max будет уничтожена при выходе! return a;
Но этого нет.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #18 : Ноябрь 26, 2007, 12:34:41 » |
|
Никто ничего не перекрывает. Заметьте, ни вас никого другого ограничивать никто не собирается. Речь идет об элементарном уважении форумчан. Здесь преподаватель на равных со студентом. Что же касается предупреждений: - код нужно оформлять. В быстром написании этиго инструмента нет, но если нажать на "Ответ" - там есть варианты оформления кодя для многих языков программирования. - флуд - вместо обсуждения вопроса, начали выяснять, у кого что по программированию, рассуждать стабильности компиляторов и т.п. Надо хотя бы пользоваться тегом offtop для этого (см. это сообщение)
А в целом, думаю, в этом споре какая-то истина родилась, посему общение оказалось небесполезным.
Модератор(ы) и форумчане, если вопрос, заданный TARAKAN исчерпан, предлагаю данную тему закрыть. Возражения есть?
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Alder
|
|
« Ответ #19 : Ноябрь 26, 2007, 12:43:50 » |
|
А мне и не надо с Вами выяснять кто умнее. Кто есть кто мы и так знаем. Если кому-то не нравятся мои ответы на вопросы некоторых из участников форума, то это их личное дело. Дело не в том - нравятся или нет, а в уважении к собеседнику. Это вполне естественно, но как у нас говорят прав тот у кого больше прав. Своими правами мы не злоупотребляем! Вы можете перекрыть мне вход на форум Если говорить прямо, то есть все основания это сделать. На данный момент вы нарушили 3 пункта правил форума: п.6 Правил раздела "Программирование" - 6. Оформление кода п. 3.3.3. Общих правил форума - 3.3.3. Чрезмерный оффтопик п.1 Правил раздела "Программирование" - 1. Общие положения "Уважайте друг друга." Но у нас лояльный админо-модерский состав, поэтому рекомендуем вам ознакомится с Правилами форума, а также с правилами тех разделов, в которых оставляете сообщения. Точно также как в каждой стране есть свои законы, так есть законы и на нашем форуме и их нужно соблюдать. Любой ответ на это сообщение будет удален без объяснения как оффтопик! Отныне пишем только в рамках темы. Если есть претензии - мне в ЛС.
|
|
|
Записан
|
"There are things known and there are things unknown, and in between are the doors..." (Jim Morrison)
|
|
|
|