C++ fatal error LNK1120

NephTis

Captain
Registriert
Apr. 2007
Beiträge
3.278
Hallo, bin gerade bei den Anfängen von C++ und wir sollen unser Programm in Unterfunktionen unterteilen mit Headerdatei...
Ursprünglich war das Programm mal nur einer C++ Datei ohne Header.
Es sollen zwei Matritzen eingegeben werden. Diese beiden werden dann addiert und ausgegeben.

// MAIN DATEI (main.cpp)
Code:
#include <iostream>
#include <conio.h>
#include "addition.h"
using namespace std;

void main (void)
{
// Addition zweier zweidimensionaler Felder (Matrizen)
int a[3][5], b[3][5], c[3][5], i=0, j=0, k=0, l=0;

//Eingabe
cout << "Bitte Matritze A eingeben:" << endl;
for (int i=0; i<3; i++)
  for (int j=0; j<5; j++)
	  cin >> a[i][j];
cout << "Bitte Matritze B eingeben:" << endl;
for (int k=0; k<3; k++)
  for (int l=0; l<5; l++)
	  cin >> b[l][k];
cin.ignore();

// Berechnung der Matritzen, Addition
addition(a[i][j], b[l][k]);

//Ausgabe
cout << "Das Ergebnis (Addition) ist C:" << endl;
for (int i=0; i<3; i++)
{
	for (int j=0; j<5; j++)
	  cout << c[i][j] << " ";
    cout << endl;
}

cin.ignore();
}

// UNTERFUNKTION (addition.cpp)
Code:
#include "addition.h"

int addition(int a[3][5], int b[3][5])
{
	int i=0, j=0, c[3][5];
	
	for (int i=0; i<3; i++)
		for (int j=0; j<5; j++)
			c[i][j]= a[i][j]+b[i][j];
	return (c[i][j]);
}

// HEADER DATEI (addition.h)
Code:
int addition (int, int);

Dateien sind auch alle ordentlich in Visual Studio eingebunden, hab ich schon gecheckt... Auf jeden Fall kommt beim kompilieren immer der Fehler "fatal error LNK1120: 1 nicht aufgelöste externe Verweise."

Ist vllt. was an meinem Quelltext falsch?
 
Die Deklaration in der Header ist falsch. Es sind nicht 2 ints, sondern 2 doppel int pointer... Ich würde einfach beide als int** übergeben, und dann natürlich noch die Größe (3 und 5) in einem extra int...
 
Auch wenn es ein Doppelarray ist, ist es ist ein einfacher int *, kein doppelter int **, denn es wird der Datentyp int referenziert und kein int *. In C/C++ ist es ausserdem unüblich Arrays zu übergeben, das macht man eher in Pascal/Delphi. Klassischerweise verwendet man in C einen Pointer auf den Anfang des Speicherbereichs. Man kann dann auch mit der Zeigervariable die indizierte Addressierung verwenden, allerdings ist der Zugriff über Zeigerarithmetik performanter (aber auch etwas komplizierter zu programmieren). In C++ würde man sich evtl seine eigene kleine Matrixklasse schreiben. Mit der STL könnte man auch einen vector verwenden.

Achtung: Der Rückgabewert von "addition" muss auch eine Matrix sein. Ausserdem würdest du momentan mit deinem Rückgabewert einen Absturz erzeugen (bitte versuchen den Fehler selbst zu finden ;))
 
Zuletzt bearbeitet:
Wenn du viel mit Matrizen arbeitest (Manipulation etc.) wärs vll sinnvoll sowas wie Boost oder Eigen zu benutzen. Nur so am Rande falls das später wesentlich umfangreicher wird.
 
So wie addition(...) momentan implementiert ist, gibt es jedes Matrix-Element einzeln zurück. Daher muß auch der Aufruf geändert werden:
Code:
cout << addition(a, b) << " ";

Das c[3][5] in main() ist nämlich momentan uninitialisiert, daher wird mit dem ursprünglichen
Code:
cout << c[i][j] << " ";
nur Grütze auf der Konsole ausgegeben...

Davon abgesehen wird auch nur das Ergebnis der letzten Multiplikation zurückgegeben.
Es ist, wie BluBlah sagt: Du mußt entweder eine Matrix zurückgeben oder alternativ nur je einen Eintrag aus jeder Matrix als Parameter übergeben und dann das Ergebnis in der main()-Methode in der dort deklarierten Matrix c speichern lassen.
 
Zuletzt bearbeitet:
Du hattest auch noch ein paar Fehler bei den Indizes, aber mir war grad so schrecklich langweilig, daher hab ichs schnell korrigiert :D

// MAIN DATEI (main.cpp)
Code:
#include <iostream>
#include "addition.h"

using namespace std;

int main(int argc, char* argv[])
{
	// Addition zweier zweidimensionaler Felder (Matrizen)
	int a[2][2], b[2][2], c[2][2], i=0, j=0, k=0, l=0;

	//init A and B with: [[1 2][3 4]]
	cout << "Matrix A:" << endl;
	for (int i=0; i<2; i++){
		for (int j=0; j<2; j++){
			a[i][j]=2*i+j+1;
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	cout << endl;
	cout << "Matrix B:" << endl;
	for (int k=0; k<2; k++){
		for (int l=0; l<2; l++){
			b[k][l]=2*k+l+1;
			cout << b[k][l] << " ";
		}
		cout << endl;
	}
	cout << endl;

	// we call "addition" with the address of the first elements of each matrix.
	// the return type is void, since "addition" works directly on the memory,
	// so the result is already written in place and there is no return value.
	addition(&a[0][0], &b[0][0], &c[0][0]);

	//Ausgabe
	cout << "Das Ergebnis (Addition) ist C:" << endl;
	for (int i=0; i<2; i++)
	{
		for (int j=0; j<2; j++){
			cout << c[i][j] << " ";
		}
		cout << endl;
	}

	cout << endl;
	cin.ignore();
}

// UNTERFUNKTION (addition.cpp)
Code:
#include "addition.h"
 
void addition(int* a, int* b, int* c)
{
	int i=0, j=0;
	
	for (int i=0; i<2; i++){
		for (int j=0; j<2; j++){

			// FIXME DEBUG: this should be drawn together for performance reasons

			int s1 = *(a+2*i+j);
			int s2 = *(b+2*i+j);
			int sum = s1 + s2;

			*(c+2*i+j) = sum;
		}
	}
}

// HEADER DATEI (addition.h)
Code:
void addition (int*, int*, int*);
 
Blublah schrieb:
Man kann dann auch mit der Zeigervariable die indizierte Addressierung verwenden, allerdings ist der Zugriff über Zeigerarithmetik performanter (aber auch etwas komplizierter zu programmieren).

Das war vielleicht in den 90ern mal relevant. Bei heutigen Compilern ist das weder wahr noch von Belang.
 
Nix da "schön wär's" ... zeig mir mal einen aktuellen Compiler, der für indizierte Zugriffe anderen Code erzeugt als für Pointerarithmetik + Dereferenzierung bzw. bei dem das zu einem meßbaren Performanceunterschied führt.
 
Zurück
Oben