LINUX.ORG.RU

Помогите новичку


0

0

Начал изучать С и никак не могу скомпилировать пример:

list_1.1.c :

#include <iostream> #include <ncurses.h>

void main() { int N,A[100]; cin >> N; for (int i=1;i<=N;i++) cin >> A[i]; int max=A[1]; for (i=2;i<=N;i++) if (max<A[i]) max=A[i]; cout << max; getch(); }

Makefile:

# Makefile list11: list_1.1.o g++ -o list11 list_1.1.o

list_1.1.o: list_1.1.c g++ -c list_1.1.c

clean: rm -f *.o list11

Получаю вывод:

bezgubov@user-desktop:~/prog/C_na_primerah/list_1.1$ make g++ -c list_1.1.c list_1.1.c:4: ошибка: ‘::main’ must return ‘int’ list_1.1.c: In function ‘int main()’: list_1.1.c:7: ошибка: нет декларации ‘cin’ в этой области видимости list_1.1.c:10: ошибка: name lookup of ‘i’ changed for new ISO ‘for’ scoping list_1.1.c:8: ошибка: используется устаревшая привязка в ‘i’ list_1.1.c:12: ошибка: нет декларации ‘cout’ в этой области видимости make: *** [list_1.1.o] Ошибка 1

что у меня не так?

Начал изучать С и никак не могу скомпилировать пример:

list_1.1.c :

#include <iostream> 
#include <ncurses.h>

void main() 
{ 
     int N,A[100];
     cin >> N;
     for (int i=1;i<=N;i++) cin >> A[i];
     int max=A[1]; 
     for (i=2;i<=N;i++) 
          if (max<A[i]) max=A[i];
     cout << max;
     getch();
}

Makefile:

# Makefile 
list11: list_1.1.o 
     g++ -o list11 list_1.1.o

list_1.1.o: list_1.1.c 
     g++ -c list_1.1.c

clean: rm -f *.o list11

Получаю вывод:

bezgubov@user-desktop:~/prog/C_na_primerah/list_1.1$ make 
g++ -c list_1.1.c 
list_1.1.c:4: ошибка: ‘::main’ must return ‘int’ 
list_1.1.c: In function ‘int main()’: 
list_1.1.c:7: ошибка: нет декларации ‘cin’ в этой области видимости 
list_1.1.c:10: ошибка: name lookup of ‘i’ changed for new ISO ‘for’ scoping 
list_1.1.c:8: ошибка: используется устаревшая привязка в ‘i’ 
list_1.1.c:12: ошибка: нет декларации ‘cout’ в этой области видимости 
make: *** [list_1.1.o] Ошибка 1 

что у меня не так?

bezgubov
() автор топика

Если изучаешь С то и пиши на С, а не на С++. Книжку поменяй на K&R.

imp ★★
()
Ответ на: комментарий от bezgubov

Да, поменяй книжку.. или вырастишь быдлокодером.
Для С - Керриган и Ритчи
для C++ - Бьерн Страуструп

anonymous
()
Ответ на: комментарий от bezgubov

>Начал изучать С и никак не могу скомпилировать пример:

Расширение у файла *.c, но исходный код на языке С++, также вы компилируете с помощью g++ (компилятора языка С++). Так какой язык вы начали изучать?! :)

>list_1.1.c:4: ошибка: ‘::main’ must return ‘int’

Что не ясно? Ф-ция main() должна возвращать int, а не void:

-void main()
+int main()

И добавьте return 1; в конец ф-ции.

>list_1.1.c:7: ошибка: нет декларации ‘cin’ в этой области видимости
>list_1.1.c:12: ошибка: нет декларации ‘cout’ в этой области видимости

Добавьте следующие строчки после подключения хедеров:

using std::cin;
using std::cout;

Или же везде пишите std::cout вместо cout и std::cin вместо cin.

>list_1.1.c:10: ошибка: name lookup of ‘i’ changed for new ISO ‘for’ scoping
>list_1.1.c:8: ошибка: используется устаревшая привязка в ‘i’

У вас во втором цикле переменная i не объявлена:

- for (i=2;i<=N;i++)
+ for (int i=2;i<=N;i++)

php-coder ★★★★★
()
Ответ на: комментарий от bezgubov

Ууууу *вглядевшись в код*

Знаете сколько у вас здесь ошибок?..

> int N,A[100]; > cin >> N; > for (int i=1;i<=N;i++) cin >> A[i];

Массивы в С/С++ начинаются с нуля. Самый первый элемент имеет индекс 0, а не 1. Соответсвенно в этом цикле вы допустили две ошибки: самый первый элемент *никогда* не инициализируется, происходит доступ к следующей за массивом памяти (так называемая off-by-one error). Правильно так:

for (int i=0; i<N; i++) cin >> A[i];

> int max=A[1];

Первый элемент имеет индекс ноль!

int max=A[0];

> for (i=2;i<=N;i++)

Опять off-by-one error detected:

for (i=1; i<N ;i++)

> if (max<A[i]) max=A[i]; > cout << max;

php-coder ★★★★★
()

---list_1.1.cpp
#include <iostream>
#include <ncurses.h>

using namespace std;

int
main()
{
    int             N,
                    i,
                   *A;
    cin >> N;
    A = new int[N];
    for (i = 0; i < N; i++)
        cin >> A[i];
    int             max = A[0];
    for (i = 1; i < N; i++)
        if (max < A[i])
            max = A[i];
    delete[]A;
    cout << max;
    getch();
}
---
---Makefile
list11:
        g++ -o list_1 list_1.1.cpp -lcurses

clean:
        rm -f *.o list_1
---
Вариант на C:
---list_1.1.c
#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>

int
main()
{
    int             N,
                    i,
                   *A;
    scanf("%d", &N);
    A = (int) malloc(sizeof(int) * N);
    for (i = 0; i < N; i++)
        scanf("%d", &A[i]);
    int             max = A[0];
    for (i = 1; i < N; i++)
        if (max < A[i])
            max = A[i];
    free(A);
    printf("%d\n", max);
    getch();
}
---
---Makefile
list11:
        gcc -o list_1 list_1.1.c -lcurses

clean:
        rm -f *.o list_1
---

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

правильный end-user вариант на ncurses:
---list_1.1.c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <ncurses.h>
#include <math.h>
#include <string.h>

int
make_some_question(char *txtoq)
{
    WINDOW *win1;
    int rval;
    int *uinbuf;
    uinbuf = (int) malloc(sizeof(int) * (log10(INT_MAX)+2));
    win1 = newwin(3, 64, LINES / 2 - 2, COLS / 2 - 32);
    box(win1, 0, 0);
    mvwaddstr(win1, 0, 32 - strlen(txtoq) / 2, txtoq);
    mvwgetnstr(win1, 1, 1, uinbuf, log10(INT_MAX)+2);
    rval = atoi(uinbuf);
    free(uinbuf);
    return rval;
}

void
put_answer(int answer)
{
    WINDOW *win1;
    win1 = newwin(3, 64, LINES / 2 - 2, COLS / 2 - 32);
    mvwaddstr(win1, 0, 31, "Max");
    mvwprintw(win1, 1, 1 , "%d", answer);
    wgetch(win1);
}

int
main()
{
    int             N,
                    i,
                   *A,
                   *q,
                   *ii;
    initscr();
    N = make_some_question("Array size?");
    A = (int) malloc(sizeof(int) * N);
    for (i = 0; i < N; i++){
        q = (int) malloc(sizeof(int) * (log10(N)+10));
        ii = (int) malloc(sizeof(int) * (log10(N)+2));
        q[0]='\0';
        strcat(q,"A[");
        sprintf(ii, "%d", i);
        strcat(q,ii);
        free(ii);
        strcat(q,"] = ?");
        A[i] = make_some_question(q);
        free(q);
    }
    int             max = A[0];
    for (i = 1; i < N; i++)
        if (max < A[i])
            max = A[i];
    free(A);
    put_answer(max);
    endwin();
}
---
---Makefile
list11:
        gcc -o list_1 list_1.1.c -lcurses -lm

clean:
        rm -f *.o list_1
---

saahriktu ★★★★★
()

спасибо всем ответившим, то что я компилировал в С++ я в курсе, просто gcc говорил что хедер iostream это С++ и ничего не компилировал, поэтому я попробовал g++ . вобщем последую совету сменить книжку.

bezgubov
() автор топика
Ответ на: комментарий от mv

>return EXIT_SUCCESS; тогда уж...

Тогда надо будет ещё и cstdlib подключать.

php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.