Knoppix.ru

Линукс в пять минут!
Текущее время: Вт дек 28, 2010 11:04 am

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Компиляция на С
СообщениеДобавлено: Ср сен 16, 2009 6:38 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
При компиляции GCC на С простейшего исходника(типа "Hello world"),компилятор выдает массу ошибок в теле функции, вплоть до ошибки " \" в функции printf( ),и не выдает исполняемого файла.Впечатление ,что он вообще не понимает.Хотя в исходнике (книга Пратта)ошибка исключена! То же с любым исходником. Какая-то общая настройка компилятора?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Ср сен 16, 2009 8:42 pm 
Не в сети

Зарегистрирован: Сб сен 06, 2003 9:33 pm
Сообщения: 148
Откуда: г. Лысково Нижегородской
Вывод cc -version в студию, ошибки и исходник тоже.
Скорее всего книга устарела, а GCC за это время ушел далеко вперед.

_________________
Злоупотребим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Чт сен 17, 2009 3:33 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Даю раскладку:GCC version 4.3.2; исходник: /*hello.c*/
#include
int main (void)
{
printf ("Hello world \n");
return 0;

}
Вывод компилятора: hello.c:In function `main`:
hello.c:6:error:stray`\302` in program
:6:error:stray`\250` in program
:6:error:`Hello` underclared(first use in this function)
:6:error:(Each undeclared identifier is reported only once for each function it appears in)
:6:error:expected `)` before`world`
:6:error:stray`\` in program
Для примера - простейшая прграмма,то же и в других.Книга -Прата-2006 г.По идее, все последующие компиляторы должны включать предыдущие версии языка. Да и книга - последняя! В чем дело?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Чт сен 17, 2009 4:15 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Сб дек 04, 2004 3:53 am
Сообщения: 549
Код:
rain@mws64:/tmp$ cat file.c
#include
int main (void)
{
        printf ("Hello world \n");
        return 0;

}
rain@mws64:/tmp$ gcc file.c -o hw

rain@mws64:/tmp$ file hw
hw: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

rain@mws64:/tmp$ ./hw
Hello world

rain@mws64:/tmp$ gcc --version
gcc (Debian 4.3.2-1.1) 4.3.2

_________________
Registered Linux User # 377068
Аз есмь линуксоид ;)
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Чт сен 17, 2009 8:39 pm 
Не в сети

Зарегистрирован: Сб сен 06, 2003 9:33 pm
Сообщения: 148
Откуда: г. Лысково Нижегородской
У меня тоже нормально компилиться.
Ты программу руками набиваешь или "копи-пастом" откуда ни будь, из pdf-а или doc-а например?
Кавычки ему твои не нравятся... \302\205 - это код кавычек, но только не тех, что нужны компилятору в строке типа: printf ("bla-bla");

_________________
Злоупотребим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Пт сен 18, 2009 6:50 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Прогамму набираю руками.Пробовал компилировать и в Midnight Commander со встроенным редактором, и с редактором -vi, результат тот же.При изменении слэша`\` на `/` ,как указано в выводе компа,данная ошибка исчезает.Впечатление,что комп-р понимает все ровно наоборот.Может, общая настройка в самой ОС Linux? Какое-то инвертирование? Если бы работал в текстовом процессоре,еще было бы понятно.Примерно то же и в в другом дистрибутиве.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Пт сен 18, 2009 8:10 pm 
Не в сети

Зарегистрирован: Сб сен 06, 2003 9:33 pm
Сообщения: 148
Откуда: г. Лысково Нижегородской
Два исходника:
Код:
#include
int main (void)
{
printf (¨Hello world \n¨);
return 0;
}

Код:
#include
int main (void)
{
printf ("Hello world \n");
return 0;
}

первый дает ошибку:
Код:
gcc hello.c -o hello
hello.c: В функции ‘main’:
hello.c:4: ошибка: в программе обнаружен некорректный символ ‘\302’
hello.c:4: ошибка: в программе обнаружен некорректный символ ‘\250’
hello.c:4: ошибка: ‘Hello’ не описан (первое использование в этой функции)
hello.c:4: ошибка: (Сообщение о неописанном идентификаторе выдается один раз
hello.c:4: ошибка: для каждой функции, в которой он используется.)
hello.c:4: ошибка: expected ‘)’ before ‘world’
hello.c:4: ошибка: в программе обнаружен непарный символ ‘\’
hello.c:4: ошибка: в программе обнаружен некорректный символ ‘\302’
hello.c:4: ошибка: в программе обнаружен некорректный символ ‘\250’
hello.c:4: предупреждение: формат не является строковой константой, и не заданы аргументы форматирования

Второй компилится без ошибок.
Что называется "найдите десять различий"

http://linuxforum.ru/index.php?showtopi ... t&p=123404

_________________
Злоупотребим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Пн сен 21, 2009 7:52 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Спасибо за помощь.Сменил раскладку клавиатуры на русскую.Получил нужные кавычки .Исполняемый файл стал создаваться, но-при просмотре информации в MC кроме собственно фразы функции и информации о системе выдает кучу ненужных , непонятных символов .Как от этого избавиться?Может,формат вывода файла в MC как-то поменять? Сообщений об ошибках нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Пн сен 21, 2009 10:04 pm 
Не в сети

Зарегистрирован: Сб сен 06, 2003 9:33 pm
Сообщения: 148
Откуда: г. Лысково Нижегородской
Я не совсем понял, что значит:
Код:
при просмотре информации в MC

Какую информацию ты просматриваешь? исходник, вывод при компиляции или результат работы программы?
Или ты mcedit-ом исполняемый файл смотришь - там конечно будет много разных символов это как ни как бинарник, его не смотреть надо, а запускать, тогда получишь результат работы.

_________________
Злоупотребим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Вт сен 22, 2009 9:37 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Исполняемый файл смотрю mcedit-ом. Вышеприведенный результат компиляции (rain) двоичной информации не содержит-такое возможно в исполняемом файле? И как это сделать для удобства просмотра в mcedit и непосредственно в оболочке?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Ср сен 23, 2009 12:25 am 
Не в сети
Аватара пользователя

Зарегистрирован: Сб дек 04, 2004 3:53 am
Сообщения: 549
Цитата:
Исполняемый файл смотрю mcedit-ом. Вышеприведенный результат компиляции (rain) двоичной информации не содержит-такое возможно в исполняемом файле?


Разве что в MC какой-то плагин стоит, который показывает не содержимое файла, а какую-то информацию о нем. У меня показывается бинарный мусор.

Цитата:
И как это сделать для удобства просмотра в mcedit и непосредственно в оболочке?

Что смотреть? Зачем смотреть? Ты создал исполняемый бинарный файл - выполни его так, как я показал и смотри результаты работы - что еще надо?

_________________
Registered Linux User # 377068
Аз есмь линуксоид ;)
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Ср сен 23, 2009 8:22 pm 
Не в сети

Зарегистрирован: Сб сен 06, 2003 9:33 pm
Сообщения: 148
Откуда: г. Лысково Нижегородской
Can писал(а):
Исполняемый файл смотрю mcedit-ом. Вышеприведенный результат компиляции (rain) двоичной информации не содержит-такое возможно в исполняемом файле? И как это сделать для удобства просмотра в mcedit и непосредственно в оболочке?

Если смотришь через F3 то это не mcedit, он по F4.
F3 - встроенный вьюер, и если им смотреть бинарник, то там действительно стоит фильтр, который выдергивает некоторую служебную информацию,
mcedit тебе тоже ничего вразумительного не покажет, тк он заточен только под текстовую информацию, а в бинарнике много нетекстовых кодов, которые отображаются как "^...^^^.^..".
Что ты конкретно хочешь увидеть?
http://www.opennet.ru/base/dev/objdump_elf.txt.html - почитай про структуру бинарников.

_________________
Злоупотребим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Чт сен 24, 2009 6:29 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Понятно, что испол.файл – бинарник. Задача была увидеть в исполняемом файле – именно текст ,заданный в исходнике через функцию printf() без бинарного мусора, как в книге Прата. В Midnight Commander это не получается ,во всяком случае настроек не знаю. И только командой “ ./ испол.файл “- в консоли – выдает чистый текст в printf() , и ничего лишнего. Почему работает именно эта команда? По идее, это указание на текущий каталог....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Чт сен 24, 2009 8:33 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Сб дек 04, 2004 3:53 am
Сообщения: 549
Цитата:
Понятно, что испол.файл – бинарник.

И тут же:
Цитата:
Задача была увидеть в исполняемом файле

Цитата:
именно текст ............ без бинарного мусора

Я, правда, так и не понял, зачем просматривать в редакторе бинарник... Ну cat'ни его, там среди всего будет и твоя строчка. Можно отсеивать только печатаемые символы, тогда будет без "мусора", но это не значит, что его нет.

Цитата:
И только командой “ ./ испол.файл “- в консоли – выдает чистый текст в printf() , и ничего лишнего.

Логично, ведь ты выполняешь написанную и скомпилированную программу.

Цитата:
Почему работает именно эта команда? По идее, это указание на текущий каталог


Вообще "./file" - именно так, без пробелов - выполнение файла file, находящегося в текущем каталоге (./)

_________________
Registered Linux User # 377068
Аз есмь линуксоид ;)
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Чт сен 24, 2009 9:14 pm 
Не в сети

Зарегистрирован: Сб сен 06, 2003 9:33 pm
Сообщения: 148
Откуда: г. Лысково Нижегородской
Чёт я по быстрому пролистал этого Прата (вообще какая то левая книга - сразу об о всем и ни о чём одновременно), и не заметил там того, что в бинарнике можно легко увидеть содержимое функций printf()...
Если скомпилить исходник с ключом -static то тогда количество "мусора" возрастет раз в 100. И искать "Hello world" будет еще сложнее.
А что ты будешь искать в искоднике если аргументом printf() будет не "Hello world", а что ни будь вроде log(pow(x,3)+cos(2*a)) ?
Вывод: Читай нормальные книги и мануалы.

_________________
Злоупотребим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Вт сен 29, 2009 7:17 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Тождественны-ли компиляторы одного типа (например, GCC 4.3.2) по своим функциям во всех дистрибутивах? Или же имеются внутри одного типа определенные различия,например, в поддержке стандарта С99.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Компиляция на С
СообщениеДобавлено: Вт сен 29, 2009 7:33 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Сб дек 04, 2004 3:53 am
Сообщения: 549
В поддержке стандартов - думаю, вряд ли, а вот функции могут добавлять/убирать - например, в Debian размер патча для GCC равен 3,4 Мб, так что изменений там прилично :).

_________________
Registered Linux User # 377068
Аз есмь линуксоид ;)
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Нелогичная работа программы на С
СообщениеДобавлено: Сб дек 12, 2009 8:22 pm 
Не в сети

Зарегистрирован: Пт сен 04, 2009 11:05 pm
Сообщения: 12
Программа на С. Непонятное нарушение ожидаемой последовательности работы программы. Самая суть, с пропуском не влияющих на данный результат операторов :

scanf ( "%c", &ch) ;
while (ch != 'q' ) // q - для выхода из цикла
{
----------------------- // пропущенные операторы
-----------------------
printf ( "Введите вес в фунтах : ") ;
scanf ( "%f ", &weight ) ;

printf ( "Введите следующий товар : ") ;
scanf ( "%c ", &ch) ;

}

printf ( "Стоимость фунта товара : % .2f \n", rate ) ;
-------------------------------------------
------------------------------------------
Компиляция проходит нормально. Но результат следующий по выполнении цикла while :

Введите вес в фунтах: 5 // ввожу число
Введите следующий товар : Введите вес в фунтах : q // здесь, явно, ожидание ввода символа оператором scanf ("%c",&ch)
// ввожу q - для выхода из цикла
Получаю:
Введите следующий товар : Стоимость фунта товара :

То есть, внутри цикла, по достижении последнего оператора printf (), ввода scanf () программа не ожидает ,как того требует алгоритм , а сразу выводит
предыдущий оператор printf () !? ; при вводе q , по выходе из цикла, получаю последний в цикле оператор printf () ! , - хотя по условию должен быть выход из цикла. То есть, первый проход цикла - нормальный , сбой при итерации. В чем может быть дело ? Все подобные программы работали нормально......


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB