Автор Тема: Компиляция на С  (Прочитано 9882 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Компиляция на С
« : 16 Сентября 2009, 07:38 »
При компиляции GCC на С простейшего исходника(типа "Hello world"),компилятор выдает массу ошибок в теле функции, вплоть до ошибки " " в функции printf( ),и не выдает исполняемого файла.Впечатление ,что он вообще не понимает.Хотя в исходнике (книга Пратта)ошибка исключена! То же с любым исходником. Какая-то общая настройка компилятора?

Aleksandr

  • Global Moderator
  • *****
  • Сообщений: 149
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #1 : 16 Сентября 2009, 09:42 »
Вывод cc -version  в студию, ошибки и исходник тоже.
Скорее всего книга устарела, а GCC за это время ушел далеко вперед.
Злоупотребим ?

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Re: Компиляция на С
« Ответ #2 : 17 Сентября 2009, 04:33 »
Даю раскладку:GCC version 4.3.2; исходник: /*hello.c*/
               #include <stdio.h>
               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 г.По идее, все последующие компиляторы должны включать предыдущие версии языка.   Да и книга - последняя! В чем дело?

rain

  • Global Moderator
  • *****
  • Сообщений: 663
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #3 : 17 Сентября 2009, 05:15 »
rain@mws64:/tmp$ cat file.c
#include <stdio.h>
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
Аз есмь линуксоид <img src=\"{SMILIES_PATH}/wink.gif\" alt=\";)\" title=\"Wink\" />
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!

Меня

Aleksandr

  • Global Moderator
  • *****
  • Сообщений: 149
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #4 : 17 Сентября 2009, 09:39 »
У меня тоже нормально компилиться.
Ты программу руками набиваешь или "копи-пастом" откуда ни будь, из pdf-а или doc-а например?
Кавычки ему твои не нравятся... 302205 - это код кавычек, но только не тех, что нужны компилятору в строке типа:  printf ("bla-bla");
Злоупотребим ?

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Re: Компиляция на С
« Ответ #5 : 18 Сентября 2009, 07:50 »
Прогамму набираю руками.Пробовал компилировать и в Midnight Commander со встроенным редактором, и с редактором -vi, результат тот же.При изменении слэша`` на `/` ,как указано в выводе компа,данная ошибка исчезает.Впечатление,что комп-р понимает все ровно наоборот.Может, общая настройка в самой ОС Linux? Какое-то инвертирование? Если бы работал в текстовом процессоре,еще было бы понятно.Примерно то же и в в другом дистрибутиве.

Aleksandr

  • Global Moderator
  • *****
  • Сообщений: 149
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #6 : 18 Сентября 2009, 09:10 »
Два исходника:
#include <stdio.h>
int main (void)
{
printf (¨Hello world n¨);
return 0;
}
#include <stdio.h>
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
Злоупотребим ?

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Re: Компиляция на С
« Ответ #7 : 21 Сентября 2009, 08:52 »
Спасибо за помощь.Сменил раскладку клавиатуры на русскую.Получил нужные кавычки .Исполняемый файл стал создаваться, но-при просмотре информации в MC кроме собственно фразы функции и информации о системе выдает кучу ненужных , непонятных символов .Как от этого избавиться?Может,формат вывода файла в MC как-то поменять? Сообщений об ошибках нет.

Aleksandr

  • Global Moderator
  • *****
  • Сообщений: 149
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #8 : 21 Сентября 2009, 11:04 »
Я не совсем понял, что значит: при просмотре информации в MCКакую информацию ты просматриваешь? исходник, вывод при компиляции или результат работы программы?
Или ты mcedit-ом исполняемый файл смотришь - там конечно будет много разных символов это как ни как бинарник, его не смотреть надо, а запускать, тогда получишь результат работы.
Злоупотребим ?

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Re: Компиляция на С
« Ответ #9 : 22 Сентября 2009, 10:37 »
Исполняемый файл смотрю mcedit-ом. Вышеприведенный результат компиляции (rain) двоичной информации не содержит-такое возможно в исполняемом файле? И как это сделать для удобства просмотра в mcedit и непосредственно в оболочке?

rain

  • Global Moderator
  • *****
  • Сообщений: 663
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #10 : 23 Сентября 2009, 01:25 »
Цитировать
Исполняемый файл смотрю mcedit-ом. Вышеприведенный результат компиляции (rain) двоичной информации не содержит-такое возможно в исполняемом файле?

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

Цитировать
И как это сделать для удобства просмотра в mcedit и непосредственно в оболочке?
Что смотреть? Зачем смотреть? Ты создал исполняемый бинарный файл - выполни его так, как я показал и смотри результаты работы - что еще надо?
Registered Linux User # 377068
Аз есмь линуксоид <img src=\"{SMILIES_PATH}/wink.gif\" alt=\";)\" title=\"Wink\" />
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!

Меня

Aleksandr

  • Global Moderator
  • *****
  • Сообщений: 149
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #11 : 23 Сентября 2009, 09:22 »
Цитата: "Can"
Исполняемый файл смотрю mcedit-ом. Вышеприведенный результат компиляции (rain) двоичной информации не содержит-такое возможно в исполняемом файле? И как это сделать для удобства просмотра в mcedit и непосредственно в оболочке?
Если смотришь через F3 то это не mcedit, он по F4.
F3 - встроенный вьюер, и если им смотреть бинарник, то там действительно стоит фильтр, который выдергивает некоторую служебную информацию,
mcedit тебе тоже ничего вразумительного не покажет, тк он заточен только под текстовую информацию, а в бинарнике много нетекстовых кодов, которые отображаются как "^...^^^.^..".
Что ты конкретно хочешь увидеть?
http://www.opennet.ru/base/dev/objdump_elf.txt.html - почитай про структуру бинарников.
Злоупотребим ?

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Re: Компиляция на С
« Ответ #12 : 24 Сентября 2009, 07:29 »
Понятно, что испол.файл – бинарник. Задача была увидеть в  исполняемом файле – именно текст ,заданный в исходнике через  функцию printf() без бинарного мусора, как в книге Прата. В Midnight Commander это не получается ,во всяком случае настроек не знаю. И только командой  “ ./ испол.файл “- в консоли – выдает чистый текст в printf() , и ничего лишнего. Почему работает именно эта команда? По идее, это указание на текущий каталог....

rain

  • Global Moderator
  • *****
  • Сообщений: 663
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #13 : 24 Сентября 2009, 09:33 »
Цитировать
Понятно, что испол.файл – бинарник.
И тут же:
Цитировать
Задача была увидеть в исполняемом файле
Цитировать
именно текст ............ без бинарного мусора
Я, правда, так и не понял, зачем просматривать в редакторе бинарник... Ну cat'ни его, там среди всего будет и твоя строчка. Можно отсеивать только печатаемые символы, тогда будет без "мусора", но это не значит, что его нет.

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

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

Вообще "./file" - именно так, без пробелов - выполнение файла file, находящегося в текущем каталоге (./)
Registered Linux User # 377068
Аз есмь линуксоид <img src=\"{SMILIES_PATH}/wink.gif\" alt=\";)\" title=\"Wink\" />
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!

Меня

Aleksandr

  • Global Moderator
  • *****
  • Сообщений: 149
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #14 : 24 Сентября 2009, 10:14 »
Чёт я по быстрому пролистал этого Прата (вообще какая то левая книга - сразу об о всем и ни о чём одновременно), и не заметил там того, что в бинарнике можно легко увидеть содержимое функций printf()...
Если скомпилить исходник с ключом -static то тогда количество "мусора" возрастет раз в 100. И искать "Hello world" будет еще сложнее.
А что ты будешь искать в искоднике если аргументом printf() будет не "Hello world", а что ни будь вроде log(pow(x,3)+cos(2*a))  ?
Вывод: Читай нормальные книги и мануалы.
Злоупотребим ?

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Re: Компиляция на С
« Ответ #15 : 29 Сентября 2009, 08:17 »
Тождественны-ли компиляторы одного типа (например, GCC 4.3.2) по  своим функциям во всех дистрибутивах? Или же имеются внутри одного типа определенные различия,например, в поддержке стандарта С99.

rain

  • Global Moderator
  • *****
  • Сообщений: 663
  • Karma: +10/-0
Re: Компиляция на С
« Ответ #16 : 29 Сентября 2009, 08:33 »
В поддержке стандартов - думаю, вряд ли, а вот функции могут добавлять/убирать - например, в Debian размер патча для GCC равен 3,4 Мб, так что изменений там прилично :).
Registered Linux User # 377068
Аз есмь линуксоид <img src=\"{SMILIES_PATH}/wink.gif\" alt=\";)\" title=\"Wink\" />
Присоединяемся к акции массового перехода на Jabber -
самую современную сеть обмена мгновенными сообщениями!

Меня

Can

  • *
  • Сообщений: 12
  • Karma: +0/-0
Нелогичная работа программы на С
« Ответ #17 : 12 Декабря 2009, 09:22 »
Программа на С. Непонятное нарушение  ожидаемой  последовательности работы программы. Самая суть, с пропуском  не  влияющих на данный результат операторов :

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 () ! , - хотя по условию должен быть выход из цикла. То есть, первый проход цикла - нормальный , сбой при итерации. В чем может быть дело ? Все подобные программы работали нормально......