logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak przerobić kod C, by skompilować go kompilatorem CC?

Szczeh 29 Lut 2008 00:04 3710 7
  • #1 4857142
    Szczeh
    Poziom 12  
    Posty: 100
    Mam taki program napisany w c:
    modul.c:
     double Dodaj(double Skl1, double Skl2)
    {
      return Skl1 + Skl2;
    }
    
    

    program.c:
    #include <stdio.h>
    
    
    double Dodaj();
    
    
    int main( )
    {
      double  Skl1 = 2.0,  Skl2 = 2.0;
      double  Wynik = Dodaj(Skl1,Skl2);
    
      printf("  Wynik dodawania:  %f + %f = %f\n",Skl1,Skl2,Wynik);
    
      return 0;
    }
    

    I mam teraz tak przerobić kod, żeby program dało się skompilować kompilatorem CC.
    Polecenia kompilacji:
    CC -c modul.c
    CC -c program.c
    CC program.o modul.o

    Niestety nie mam pomysłu
  • #2 4857230
    mietekn
    Poziom 35  
    Posty: 1983
    Pomógł: 400
    Ocena: 161
    Tak prosty program powinien się skompilować bez żadnych przeróbek.
  • #3 4857521
    Szczeh
    Poziom 12  
    Posty: 100
    Gdyby rzeczywiście tak było to, nie pisał bym o tym tutaj.
    Błąd zgłasza błąd podczas kompilowania pliku program.c.
    Treść błędu mówi o tym, że wywołana funkcja dodaj ma za dużo argumentów, dokładnie o 2 za dużo...
  • #4 4857549
    __Grzegorz__
    Poziom 30  
    Posty: 1413
    Pomógł: 196
    Ocena: 233
    prototyp funkcji dodaj w program.c powinien być chyba:

    double dodaj(double,double);


    ???
  • #5 4857560
    szwagros
    Poziom 33  
    Posty: 1843
    Pomógł: 232
    Ocena: 271
    Szczeh napisał:
    Treść błędu mówi o tym, że wywołana funkcja dodaj ma za dużo argumentów, dokładnie o 2 za dużo...

    I dobrze mówi. Deklarujesz funkcję jako
    double Dodaj();
    czyli bezargumentową, a później podajesz jej dwa argumenty:
    Dodaj(Skl1,Skl2);

    Deklaracja funkcji powinna wyglądać tak:
    double Dodaj(double,double);
  • #6 4857567
    Szczeh
    Poziom 12  
    Posty: 100
    Chodzi o to, żeby nie trzeba było znać, jakie ta funkcja przyjmuje argumenty. Jest ona zadeklarowana w pliku modul.c, a w pliku program.c zapowiadam jedynie, że chcę jej użyć. użyłem czegoś takiego:
    double Dodaj(...);

    i udało się skompilować moduł główny, ale podczas konsolidacji wyrzuca błąd, który mówi o nieznanym symbolu double Dodaj(...)

    Program działa w języku C z deklarcją
    double Dodaj();
    ponieważ argumenty po prostu nie zostały określone. Pytanie czy w C++ też jest taki mechanizm, który pozwoli nie podawać argumentów przy prototypie funkcji:?:
  • #7 4857601
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Co to znaczy ma nie znac argumentow ? A ty potrafisz rozwiazac problem nie wiedzac o co chodzi ?
    Podejrzewam ze moze ci chodzic o cos takiego:
    
    void PrintFloats ( int amount, ...)
    {
      int i;
      double val;
      printf ("Floats passed: ");
      va_list vl;
      va_start(vl,amount);
      for (i=0;i<amount;i++)
      {
        val=va_arg(vl,double);
        printf ("\t%.2f",val);
      }
      va_end(vl);
      printf ("\n");
    }
    
  • #8 4857811
    mietekn
    Poziom 35  
    Posty: 1983
    Pomógł: 400
    Ocena: 161
    deklaracja double Dodaj(); to tylko uproszczona deklaracja double dodaj(double,double); której C nie kontroluje a C++ tak. Nie powoduje to w żaden sposób że deklaracja może mieć nieokreśloną liczbę parametrów, w modul.c masz bowiem dokładnie określone ile ich jest. Jeśli chcesz zmieniać liczbę parametrów musisz skorzystać z operatora ... tak jak to zacytował fantom.

    PS. Na przyszłość: Jeśli zadajesz pytanie o błąd to wypada na wstępie zacytować jaki jest ;).

Podsumowanie tematu

✨ Problem dotyczy kompilacji programu w języku C za pomocą kompilatora CC, gdzie funkcja Dodaj jest zadeklarowana w pliku modul.c jako double Dodaj(double Skl1, double Skl2), a w program.c prototyp funkcji jest niepoprawny: double Dodaj(); co powoduje błąd kompilacji mówiący o zbyt dużej liczbie argumentów. W C deklaracja double Dodaj(); jest traktowana jako funkcja o nieokreślonej liczbie argumentów, ale w C++ i przy kompilacji CC wymaga się dokładnego prototypu z określeniem typów argumentów, np. double Dodaj(double, double);. Próba użycia deklaracji z ellipsą double Dodaj(...); pozwala na kompilację, ale powoduje błąd linkera z powodu nieznanego symbolu. Rozwiązaniem jest poprawne zadeklarowanie prototypu funkcji w program.c z dokładnym określeniem typów argumentów, zgodnie z definicją w modul.c. W dyskusji pojawiła się także sugestia użycia funkcji z parametrami zmiennymi (varargs) przy pomocy operatora ..., jeśli liczba argumentów ma być zmienna, jednak w tym przypadku nie jest to wymagane.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA