Deklaracje i definicje w jednym pliku

0

Witajcie,
Mam pytanie, przypuszczam że dość proste, jednak nie dla mnie:) Mam załóżmy kod główny w main.cpp, i chce korzystać w nim z funkcji z func.cpp. Tak więc, na początek w main.cpp daję

#include "main.cpp"

I zaczyna się jazda z multiple definitions dla każdej z zaimplementowanych funkcji. I teraz moje pytanie - bo gdyby mógł zrobić definicje i deklaracje osobno, w cpp i h, to by było jasne. Jak to zawrzeć w jednym pliku? Jakieś dyrektywy? Dodam, że wszystkie funkcje są przeciążane(wszystko dla jednej nazwy), a korzystam z DevC++

Poooommmooooccccy;p

Pozd.

0

przepraszam, pomyłka, oczywiście includuję

 #include "func.cpp"
0

Należy includować jedynie plik nagłówkowy z deklaracjami tych funkcji. Następnie należy skompilować oba pliki i zlinkować.
W przypadku Deva należy:

  1. Odinstalować deva.
  2. Zainstalować Code::Blocks
  3. Stworzyc nowy projekt. Dodać do niego pliki main.cpp, func.cpp i func.h
  4. W main.cpp dodać #include "func.h" i zbuildować wszystko.
0

OK, ale problem jest taki, że do sprawdzenia muszę wysłać jedynie plik cpp, który później będzie testowany(i może zawierać tylko funkcje o tej jednej nazwie). Dla mnie to też jest bez sensu, bo pewnie będzie includowany w testach, ale nie ja ustalam reguły.

0

Albo może tak.

Po wysłaniu na sprawdzarkę:
make: Entering directory /home/testerka/work' g++ test2.cpp -o out -static test2.cpp:4:20: error: func.cpp: No such file or directory test2.cpp: In function ‘int main()’: test2.cpp:10: error: ‘catch22’ was not declared in this scope make: *** [2] Error 1 make: Leaving directory /home/testerka/work'

Dziwi mnie to no such file or directory... Takich testów jest 8, po jednym dla każdego przeciążenia.

0

Ale ja nadal nie widzę problemu. Wykładowca kazał wam wysłać plik *.cpp zawierający definicję funkcji o danej sygnaturze? To znaczy ze on u siebie zrobi dokładnie to co napisałem powyżej. Czyli w pliku z funkcją main() ma deklarację takiej funkcji i wywołania tej funkcji, a oprócz tego ma makefile który skompiluje oba pliki (jego testujący i ten twój) i je zlinkuje.

@up ty tak poważnie? Wysłałeś do sprawdzarki plik cpp który próbuje includować inny plik którego TAM NIE MA. To i nie dziwota że masz no such file.

0

Zacznijmy od tego, że to nie jest zadanie dla mnie;) Tak więc schemat działania wygląda niestety tak, że jedyną informacją na temat niedziałania jest to, co zamieściłem powyżej. W poleceniu jest napisane, żeby wysłać plik cpp z wyłącznie definicjami lub deklaracjami funkcji o nazwie catch22. Próba wrzucenia samego pliku cpp, kończy podobno się tym samym. Nie wiem, zaczynam podejrzewać jakiś błąd sprawdzarki albo cholera wie. Ponadto widzę, że w poleceniu jest napisane, że należy spakować zipem. Nie jest pod jaką nazwą. Może ona po prostu nie widzi tego ładowanego pliku...
Pomijając fakt, że jeśli gość ma gotowy plik .h, to prototypy funkcji z niego mogą nie zgadzać się z definicjami...

0

Chociaż możesz mieć rację z tym wyodrębnieniem u mnie do cpp i h. Poprzednio było wysyłane na zasadzie "wytnij wszystko oprócz catch22-ów". Także zrobię tak jak mówisz, wyślę, zostanie wysłane na sprawdzarkę i wtedy dostanę odpowiedź:) Więc jakbyś mógł, zajrzyj tu wieczorem w celu ew. dalszych konsultacji:)

Pozdr.

0
tewu napisał(a)

Chociaż możesz mieć rację z tym wyodrębnieniem

Sądziłeś chociaż przez chwilę, że nie ma racji? To po co pytasz na forum skoro wiesz lepiej:]

0
odp napisał(a)
tewu napisał(a)

Chociaż możesz mieć rację z tym wyodrębnieniem

Sądziłeś chociaż przez chwilę, że nie ma racji? To po co pytasz na forum skoro wiesz lepiej:]

Nie masz niczego innego do robienia w niedzielę oprócz interpretowania(błędnego, swoją drogą) cudzych wypowiedzi na forum? Współczuję. I tak cieszę się, że nie napisałeś "poszukaj w google". Dzięki!

Mam już odpowiedzi ze sprawdzarki:
make: Entering directory /home/testerka/work' g++ test1.cpp -o out -static In file included from test1.cpp:4: prog.cpp:5:18: error: prog.h: No such file or directory In file included from test1.cpp:4: prog.cpp: In function ‘void catch22(unsigned int, int&, ...)’: prog.cpp:47: warning: second parameter of ‘va_start’ not last named argument make: *** [1] Error 1 make: Leaving directory /home/testerka/work'

Czyli jakby nie miał tego nagłówkowego. A wysłać go mu nie można... A ten warning, to swoją drogą iny problem - ma być (liczba argumentów, wynik, kolejne liczby), a wiadomo, że liczba argumentów ma być jako ostatnia przed ...(...) Masz jakiś pomysł?

0

http://forums.bleachexile.com/member.php?u=55578&ux37=3 [url=http://forums.bleachexile.com/member.php?u=55577&ux37=3]diazepam[/url] buy acomplia <a href=http://forums.bleachexile.com/member.php?u=55580&ux37=3>viagra</a> [url="http://forums.bleachexile.com/member.php?u=55579&ux37=3"]cheap viagra[/url] [LINK http://forums.bleachexile.com/member.php?u=55581&ux37=3]discount cialis[/LINK] ftnr

0

@tewu czy ty sobie robisz jaja? Z loga wynika dokładnie to co pisałem -> NIE MOŻESZ sobie tam nic includować. W pliku który wysyłasz. Z łaski swojej dopytaj kolegów/prowadzącego co tak na prawdę masz wysłać. Bo na oko to deklaracja tej twojej funkcji catch22 też jest błędna...

0

Witam,
Nie robię sobie jaj. W poleceniu jest napisane dokładnie

Całosc implementacji ma znalezc sie w pliku prog.cpp. Archiwum zip zawierajace
wyłacznie ten plik ma zostac wysłany do systemu
W pliku prog.cpp nie moga znalezc sie definicje oraz deklaracje funkcji o nazwie innej
niz catch22.

Wykładowca mówi, że nie będzie udzielał żadnych odpowiedzi do terminu wysłania. Widzę, że mi nie wierzysz, ale sytuacja wygląda tak jak napisałem - ja nie mam kontaktu z tymi ludźmi. Zrobiłem tak jak mówiłeś, zostało wysłane. Nie działa. Więc?

0

Pokaż tutaj kod pliku który wysłałes.

0

W ostatniej wersji:
prog.h

#if !defined(_PROG_H_)
#define _PROG_H_

int catch22(int);
int catch22(int, int);
int catch22(int, int, int &);
void catch22(unsigned int, int &, ...);
int catch22();
int catch22(int, int*);
int catch22(int (int), int = 0, int = 100);
void catch22(int*, int);

#endif

prog.cpp

#include <cstdlib>
#include <cstdarg>

#include "prog.h"

int catch22(int n)
{
    if (n < 0)
    {
        return 0;
    }    
    if (n == 0)
    {
        return 1;
    }
    return catch22(n - 1) * n;
}

int catch22(int a, int b)
{
    if (b > a)
    {
        return 0;
    }
    if (b == 0 || a == b)
    {
        return 1;
    }
    return catch22(a - 1, b - 1) + catch22(a - 1, b);
}

int catch22(int a, int b, int &c)
{
    c = 0;
    for (int i = a; i <= b; i++)
    {
        c += i;
    }
    return c;
}

void catch22(unsigned int n, int &x, ...)
{
    x = 0;
    va_list ap;
    va_start(ap, n);
    for ( ; n > 0; n--)
    {
        x += va_arg(ap, int);
    }
    va_end(ap);
}

int catch22()
{
    return rand() % 2;
}

int catch22(int a, int* b)
{
    int sum = 0;
    for (int i = 0; i < a; i++)
    {
        sum += *(b + i);
    }
    return sum;
}

int catch22(int f(int), int a, int b)
{
    int sum = 0;
    for (int i = a; i < b; i++)
    {
        sum += f(i);
    }
    return sum;
}

void catch22(int* a, int b)
{
   if (b >= 0)
   {
      a[0] = 0;
      if (b > 0)
      {
         a[1] = 1;
            for (int i = 2; i <= b; i++)
           {
                a[i] = a[i - 2] + a[i - 1];
           }
       }
   }
}
0

Wysłane było w parze to i to, jak również sam cpp

0

Wywaliłbym te wszystkie odwołania do *.h i sam plik *.h i zostawil tylko i wyłącznie źródła do tej funkcji.

0

Tak już było też wysyłane(na samym początku) i pojawiał się wtedy ten błąd, że nie może znaleźć(w drugim bodajże poście prog zmieniłem w opisie błędu na func celowo, żeby nie mieszać, także ta sprawa jest akurat ok) pliku. Teraz będzie wysłane dla pewności jeszcze raz w tej postaci i zobaczymy.

0

No i nic. Nie działa.

0

Problem jest w tym ze na testerke masz wyslac tylko i wylacznie plik prog.cpp. Nie mozesz includowac w nim tego prog.h.
Tak jak pisze Shalom: wywal cale prog.h, w prog cpp dorob include guard'a i powinno byc dobrze...

1 użytkowników online, w tym zalogowanych: 0, gości: 1