Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przekazywanie tablicy dwuwymiarowej do funkcji (Windows/Linux)

Ostatnio zmodyfikowano 2015-11-27 21:17
Autor Wiadomość
xkazeshinix
Temat założony przez niniejszego użytkownika
[C++] Przekazywanie tablicy dwuwymiarowej do funkcji (Windows/Linux)
» 2015-11-26 13:10:20
Witam! Mam problem z przekazaniem tablicy dwuwymiarowej do funkcji:
Pliki:

main.cpp:

#include <iostream>
#include "Biblioteka.h"
using namespace std;

Plansza p ={
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,0,0,0,0,0,0,0,0,10},
        {10,10,10,10,10,10,10,10,10,10},

};

int main()
{
    Wyswietlanie(p);
    system("pause");

    return 0;
}
Biblioteka.h:

#pragma once
const int t = 10;
typedef int Plansza[2*t][t];


void Wyswietlanie(Plansza p);

View.cpp:

#include "Biblioteka.h"
#include <iostream>
using namespace std;

void Wyswietlanie(Plansza p)
{
    for(int i = 0; i < 2*t; i++)
    {
        for(int j = 0; j < t; j++)
        {
            switch(p[i][j])
            {
                case 0:
                    cout<<" ";
                    break;
                case 10:
                    cout<<"x";
                    break;
                case 5:
                    cout<<"&";
                    break;
                case 1:
                    cout<<"@";
                    break;
            }
            cout<<endl;
        }
    }
}
Powyzszy kod kompiluje sie bezproblemowo w srodowisku Windowsowym (Dev-C++ - TDM-GCC) natomiast pod Linuxem (g++) otrzymuje blad kompilacji:

CMakeFiles/Tetris_2.dir/main.cpp.o: In function `main':
/home/xkazeshinix/Desktop/Programowanie/c++/Tetris 2/main.cpp:32: undefined reference to `Wyswietlanie(int (*) [10])'
collect2: error: ld returned 1 exit status
CMakeFiles/Tetris_2.dir/build.make:94: recipe for target 'Tetris_2' failed
make[3]: *** [Tetris_2] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/Tetris_2.dir/all' failed
make[2]: *** [CMakeFiles/Tetris_2.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/Tetris_2.dir/rule' failed
make[1]: *** [CMakeFiles/Tetris_2.dir/rule] Error 2
Makefile:118: recipe for target 'Tetris_2' failed
make: *** [Tetris_2] Error 2

Wie ktos jak moge rozwiazac ten problem pod Linuxem?
Z gory dziekuje za pomoc.

EDIT:
Dodalem sekcje plikow i bibliotek w kazdym z plikow.
P-140834
piotrmaceluch
» 2015-11-27 00:10:36
Nie wiem co znaczy log błędu. Mogę jednak zaproponować program Eclipse :)

undefined reference to `Wyswietlanie(int (*) [10])'
<- na tym bym się skupił :)

P-140888
xkazeshinix
Temat założony przez niniejszego użytkownika
» 2015-11-27 06:31:56
Ja uzywam programu CLion lub notatnika Atom i g++ z konsoli gdyz czasami musze linkowac biblioteki z terminala (np. lncurses).. Odnosnie bledu znajomy stwierdzil, ze wyglada to tak jakby program niewidzial tej funkcji.. Idac za tropem tymczasowo rozwiazalem problem dajac #include "View.cpp" w pierwszym pliku natomiast dalej nwm CZY metoda, gdzie do pliku main.cpp dodaje Biblioteka.h(w niej odwoluje sie do funkcji) i w pliku View.cpp dolaczam plik Biblioteka.h (bez #include "View.cpp" w main.cpp) dziala pod linuxem ale mam gdzies blad CZY ta metoda niedziala i musze wszystko dodawac do main.cpp (tu by wychodzilo na to ze pliki *.h sa bezuzyteczne)..
P-140892
carlosmay
» 2015-11-27 08:46:48
Może spróbuj *.hpp
P-140894
michal11
» 2015-11-27 09:06:29
Zamień
#include Biblioteka.h
 na
#include "Biblioteka.h"
P-140895
xkazeshinix
Temat założony przez niniejszego użytkownika
» 2015-11-27 09:41:15
@carlosmay sprobuje jak dotre do domu ;)

@michal11 moj blad przy przepisywaniu oczywiscie w programie jest #include "Biblioteka.h "
P-140898
alixir
» 2015-11-27 10:47:08
Z ciekawości sprawdziłem u siebie ... i działa normalnie. Więc albo kwestia wersji g++, albo robisz jakiś błąd podczas kompilacji.
Napisz sobie prosty plik Makefile:

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp View.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=tetris

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
        $(CC) $(CFLAGS) $< -o $@

clean:
        $(RM) $(EXECUTABLE) *.o *~

i kompiluj poprzez
make

P-140903
xkazeshinix
Temat założony przez niniejszego użytkownika
» 2015-11-27 21:17:22
Wrocilem do domu i troche nad tym posiedzialem i juz wiem dlaczego mi nie widzialo tej funkcji.. otoz g++ potrzebuje zeby w terminalu podac wszystkie *.cpp czyli zamiast:
g++ main.cpp
to:
g++ main.cpp View.cpp

To dalo mi do myslenia.. Wychodzi na to, ze program CLion nie podlacza sobie plikow kiedy sie kompiluje, nalezy to zrobic recznie w pliku CMakeLists.txt (ktory sam sie tworzy kiedy robimy nowy projekt) nalezy tam zmienic linijke:
set(SOURCE_FILES main.cpp)
na [w moim przypadku]:
set(SOURCE_FILES main.cpp View.cpp)

Dziekuje wszystkim za pomoc! Zamykam temat ;)

P-140954
« 1 »
  Strona 1 z 1