Pokaż wyniki 1 do 10 z 10

Temat: Bardzo dziwne błędy

  1. #1

    Domyślnie Bardzo dziwne błędy

    Przenosiłem własny program z windy na linuxa. Na windowsa był napisany w Dev-C++. Pliki źródłowe miały rozszerzenie cpp, ale program był napisany w całości w c.
    Kopiuje pliki do katalogu domowego, zmieniam rozszerzenie na c, i przystępuje do edycji. W programie wykorzystałem gniazda i wątki, ale większość opierała się na bibliotece standardowej. Edycja polegała na zmianie plików nagłówkowych, typów zmiennych i kilku nazw funkcji(do wątków). Wszystko wyglądało dobrze.
    Założyłem nowy projekt w Code::Blocs (język C) dodaje pliki, opcje do kompilatora i Build.
    Fragment pliku file.c
    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "file.h"
    #define MAX_SOCKS 5
    
    extern bool file;
    extern char* filename;
    extern FILE* plik;
    
    void u_set_file(char* name,int first) //EDIT mała poprawka
    {
        filename=(char*)malloc(128);
        int a=strlen(name);
        int i=0;
        for(int b=first;b<a;b+=1)
        {
            filename[i]=name[b];
            i+=1;
        }
        filename[i]=0;
        file=true;
    }
    A oto jakie błędy wywalił kompilator:
    Kod:
    file.c:8: błąd: expected `=,, `,,, `;,, `asm, or `__attribute__, before `file,
    file.c: W funkcji `u_set_file,:
    file.c:18: błąd:  for, loop initial declaration used outside C99 mode
    file.c:25: błąd: `file, undeclared (first use in this function)
    file.c:25: błąd: (Each undeclared identifier is reported only once
    file.c:25: błąd: for each function it appears in.)
    file.c:25: błąd: `true, undeclared (first use in this function)
    W tej funkcji jest pętla for i gcc wywalał błąd:
    for, loop initial declaration used outside C99 mode (pomoga deklaracja zmiennej sterującej poza pętlą)
    w innych plikach mam takie same petle i nie było błędów, a tutaj jeszcze jest coś e linii: extern bool file; ( w innych plikach brak błędów) co wywołuje następne.
    Co jest nie tak
    Dodam jeszcze, że to jedyny plik gdzie jest includowane stdlib.h i string.h
    Ostatnio edytowane przez rafal44 : 09-06-2008 - 20:38
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  2. #2
    Zarejestrowany
    Apr 2008
    Postów
    200

    Domyślnie

    Aby wykorzystać typ bool musisz dodać poniższy wiersz do swojego kodu:
    Kod:
    #include <stdbool.h>

  3. #3

    Domyślnie

    ekhem
    bufer owerfloł
    Ostatnio edytowane przez Egoalter : 09-05-2008 - 21:58

  4. #4

    Domyślnie

    Ale dlaczego to jest kompilowane w standardzie C99 Na windzie wszystko było dobrze a tutaj zmiena sterująca musi być zadeklarowana poza pętlą. Do tego wywala, że bind ma za mało argumentów( a są 3). W jakim standardzie są kompilowane programy pod windą( Dev-C++ używa kompilatora GNU)
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  5. #5

    Domyślnie

    Dlatego że tFuj kompliminator (heh) jest zgodny z tym standatem
    Ogólnie masz tu przepełnienie bufora na stercie
    pozatym ogólne błedy logiki
    że tak to ujme
    np
    poco urzywasz sterty skoro rozmiar bufora jest stały i znany z góry
    ?
    poco wszystko tak komplikujesz ........
    Ostatnio edytowane przez Egoalter : 09-06-2008 - 16:30

  6. #6

    Domyślnie

    Cytat Napisał rafal44 Zobacz post
    Ale dlaczego to jest kompilowane w standardzie C99 Na windzie wszystko było dobrze a tutaj zmiena sterująca musi być zadeklarowana poza pętlą. Do tego wywala, że bind ma za mało argumentów( a są 3). W jakim standardzie są kompilowane programy pod windą( Dev-C++ używa kompilatora GNU)
    No wlasnie nie uzywa C99...

    Zaiste uzycie google.com jest trudne...

    C99 is a more recent standard of C than the one GCC uses by default.

    Declaring the loop counter (in this case i) inside the for loop is only allowed in C++ files unless you tell GCC to use the C99 standard. For C and ObjC, you need to declare i outside the loop.
    Cytat z 1. linka po wklepaniu "for, loop initial declaration used outside C99 mode" w wyszukiwarke.

  7. #7

    Domyślnie

    Nie ma przełnienia bufora na stercie, poprostu w małych projektach nie stosuje zasady ograniczonego zaufania. Zminna globalna to wskaźnik do nazwy pliku; tablica jest tworzona gdy jest potrzebna. Wskaźnik jest globalny bo używa go więcej funkcji. Nie zapomniałem też o zwalnianiu zasobów(free).
    Mogłem też zrobić tak:
    Kod:
    int a=strlen(name);
    filename=(char*)malloc(a+2);
    ale jakoś tak zostało.
    A wracając do tematu to skompilowanie projektu jako C++ pomoże? No bo też to mi przyszło do głowy, nie było czasu sprawdzić.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  8. #8

    Domyślnie

    Nie wiem z kąd wytrzasłeś tekst
    "...w małych projektach nie stosuje się zasady ograniczonego zaufania..."
    Podejrzewam że jesteś studentem informatyki gdzieś tam .
    No ale skoro tak twierdzisz to ok
    Ja mówie że przepełnienie jest
    Jestem uparty i zostane przy swoim
    Nikt mi nie wmówi że czarne jest czarne a białe jest białe

  9. #9
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Egoalter, zauważ, że on nie napisał "nie stosuje się", tylko "nie stosuje". A to duża różnica Ale ogólnie, to cię popieram. Z tym, że jeśli tej funkcji nie będzie się używało do przyjmowania danych od użytkownika, to taki bóffer overflowek nie jest specjalnie groźny, prawda?
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  10. #10

    Domyślnie

    Dobra nieważne zrobie tak:
    Kod:
    int a=strlen(name);
    filename=(char*)malloc(a+2);
    strncpy(filename,name,a);
    Ale jest jeszcze jeden problem: jak to skompilować z opcją -lpthread? Gdzie się to ustawia w Code::Blocks. No bo ja to dopisuje w oknie Project build options w zakładce compiler settings , other options, ale wywala mi błędy undefined reference to pthread_create itp.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

Podobne wątki

  1. Błędy na www - wykorzystanie/zabezpieczenie
    By Kapec in forum Newbie - dla początkujących!
    Odpowiedzi: 5
    Autor: 07-12-2008, 21:58
  2. dziwne zmiany daty logowania
    By promenada in forum Newbie - dla początkujących!
    Odpowiedzi: 2
    Autor: 06-09-2008, 18:06
  3. Dziwne "krzaczki" przy wchodzeniu na forum.
    By mtbs in forum /dev/null
    Odpowiedzi: 2
    Autor: 05-02-2008, 16:25
  4. Sniffowanie Sieci LAN<dziwne>
    By eryk in forum Newbie - dla początkujących!
    Odpowiedzi: 7
    Autor: 07-24-2007, 12:36
  5. dziwne odgłosy podczas drukowania
    By Krystian007 in forum Windows
    Odpowiedzi: 3
    Autor: 05-26-2007, 10:10

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj