# Array spaltenweise durchsuchen



## ania (5. Juli 2010)

Hallo,

ich habe ein Array namens bfeld[3][99], dass aus vier Spalten und 100 Zeilen besteht. Die ersten drei Spalten stehen jeweils für die x,y und z-Komponenten eines B-Feldes, dessen Betrag in der vierten Spatle meines Arrrays steht. Ich habe also eine Matrix in der der Betrag und die Koordinaten für mein B-Feld drinstehen (x,y,z,B).  Außerdem habe ich noch drei  Zahlen A, B, C (das können jetzt beliebige Zahlen sein). Was ich gerne machen möchte ist:
1. nur die erste Spalte meines Arrays nach der selben Zahl wie A zu durchsuchen
2. nur die zweite Spalte meines Arrays nach der selben Zahl wie B zu durchsuchen
3. nur die dritte Spalte meines Arrays nach der selben Zahl wie C  zu durchsuchen

und die Ausgabe soll dann eine Zahl aus der vierten Spalte (wo der Betrag meines B-Feldes) drin steht sein.  Ich möchte also, dass für jedes A, B, C, die passende Zahl für das B-Feld aus der vierten Spalte des Arrays ausgegeben wird. 

Da die Zahlen A, B, und C ,wie schon gesagt beliebige Zahlen sein können, und somit die Gefahr besteht, dass ich keine passende Zahl dazu in meinem Array finden kann, möchte ich bei meiner Suche eine minimale  Abweichung "sigma" einbauen, die es mir erlaubt einen Werte z.B. A+sigma (oder B+sigma, oder C+sigma) in dem Array als Ausweichlösung zu finden. Sprich, falls sich z.B. in der ersten Spalte meines Arrays kein Wert findet, der ==A ist, so kann auf ein Wert ==( A+sigma) zurückgegriffen werden.

Ich habe zwar im Internet ein paar Vervahren wie z.B. binarysearch gefunden, konnte aber für das was ich vorhabe nicht viel damit anfangen. Ich weiß nicht mal, ob die Art und Weise, wie ich mein Array durchsuchen möchte überhaupt möglich ist. Ich hoffe, dass mir da jemand helfen kann,. da ich im Bereich durchsuchen von Arrays keine Erfahrung habe. Ich wäre wirklich sehr dankbar für eure Hilfe.


P.S.:Falls ich mich irgendwo noch ungenau ausgedrückt habe, kann ich ruhig noch mehr ins Detail gehen.

Viele Grüße,
ania


----------



## ComFreek (5. Juli 2010)

ania hat gesagt.:


> P.S.:Falls ich mich irgendwo noch ungenau ausgedrückt habe, kann ich ruhig noch mehr ins Detail gehen.


Ja, bitte. Wenn man ein Array _int a[3]_ hat, dann hat dieses Array nur drei Felder: [0], [1], [2]. Aber du sagtest vier. Außerdem habe ich die Fragen nicht ganz verstanden, aber ich lese sie mir auf jeden Fall nochmal durch.


----------



## badday (5. Juli 2010)

Du hast hier offenbar einen Fehler gemacht.
Denn für 4 Spalten und 100 Zeilen brauchst du sehrwohl
array[4][100]
Das ein Array bei Index 0 beginnt spielt hier nämlich keine Rolle. Siehe http://www.cplusplus.com/doc/tutorial/arrays/

Gruß,

badday


----------



## ania (5. Juli 2010)

Hi,
ja ihr habt recht *schäm*, es muss bfeld [4][100] heißen.Ich habe da etwas verwechselt gehabt. Sorry. Da ich mich wie bereits geahnt etwas unverständlich ausgedrückt habe starte ich gerne einen zweiten Versuch.
Also nehmen wir mal an, ich hätte eine kleine Matrix (die Werte sind jetzt frei erfunden), wie z.B. diese: test [4][5]
x       y      z      BF
1,1  1,1  1      6
2,1   2    2,2   4
3,2   3   3,1    8
4     4      4,2   3
5,3  5    5,3    2

Wie ich zur Übersicht darüber geschrieben habe, stehen in der ersten Spalte alle Werte für die x-Koordinaten, in der zweiten Spalte die Werte für die y-Koordinaten und in der dritten Spalte die Werte für die z-Komponente. In der vierten Spalte steht ein Wert für BF. Somit habe ich z.B. für x=2,1, y=2 und z=2,2 den Wert BF=4.
Zusätzlich habe ich noch drei weitere Werte A, B, C,  (die eigentlich auch x,y,z-Koordinaten entsprechen)die jedes mal einen anderen Wert haben können. Ich möchte mein Array für jedes neue A (B oder C) dann halt immer wieder von neu durchsuchen. Die Suche soll wie folgt geschehen:
In der Spalte wo die x-Werte drinstehen, möchte ich einen Wert finden, der dem Wert von A entspricht.
Beispiel: Für A=2,1, findet sich gleich in der zweiten Zeile von der ersten Spalte der selbe Wert. Ich möchte also NUR in der ersten Spalte nach Werten suchen, die gleich A sind und NUR in der zweiten Spalte nach Werten suchen, die gleich B sind usw. 
Wenn ich nun ein A=2,1  , ein B=2 und ein C=2,2  in meinem Array gefunden habe, dann möchte ich den dazugehörigen BF-Wert (BF=4) aus der vierten Spalte als Ausgabe BF bekommen. 
Da es aber sein kann dass z.B. mein A= 5 ist, es in der ersten Spalte aber nur eine 5,3 gibt, möcht ich eine Art tolerierbare maximale Abweichung von z.B. +-0,5 definieren, damit die Suche trotzdem erfolgreicht ist. Mit anderen Worten, wenn ich nach einem Treffer in meinem Array für A=5 suche, möchte ich, dass 5,3 auch als Treffer gesehen wird, weil die Ziffer 5,3 nur um 0,3 von meinem A=5 abweicht, und ich das als tolerierbar definiert habe. Dieselbe Abweichung soll dann auch für B und C gelten.

Hintergrund der ganzen Programmierung ist, dass ich die magnetische Kraft auf ein Partikel berechnen möchte, dass sich mit einer Strömung bewegt. Dabei entsprechen die Werte von A,B,C den x,y,z-Komponetnen bzw. den Koordinaten meines Partikels. Diese verändern sich daher, da sich das Partikel wie schon gesagt mit der Strömung bewegt und somit nicht auf der selben Stelle bleibt. Ich möchte die Laufbahn dieses Partikels mit einer magnetischen Kraft, dass sich im Raum (x,y,z) um das Partikel herum befindet, beeinflussen. Dieses B-Feld hat zu jeden Koordinaten einen Betrag, den ich dann in meiner Kraftrechnung einbringen muss. Um zu wissen welchen Betrag von BF ich nun genau brauche, muss ich halt immer wissen wo mein Partikel ist, und den Betrag vom B-Feld hernehmen, dessen Koordinaten genau den Koordinaten des Partikels entsprechen. Eigentlich benutzte ich eine Simulationssoftware, die mir auch immer die neuen Werte von A,B und C gibt, um die Bewegung des Partikels zu simulieren. Um das magnet. Feld mit einzubringen, muss ich aber leider ein benutzerspezifisches Programm schreiben und die Sprache in der die Programme für  diese Simulationssoftware geschrieben werden ist nunmal C.

Ich hoffe, dass ich es jetzt etwas besser erklären konnte. Ansonsten bei mir nachhacken. Und vielen Dank nochmal, für eure Unterstützung!

Viele Grüße,
ania


----------



## MCoder (6. Juli 2010)

Hallo ania,

nimm doch zum Durchsuchen einfach eine Schleife über die 100 Zeilen.

Gruß
MCoder


----------



## Jennesta (6. Juli 2010)

WieMCoder sagte iterier einfach in eienr Schliefe jede Spalte durch. 

Und um deine Abweichung zu finden prüfe einfach ob der Betrag von der Differenz von A (oder B oder C) mit der Zahl kleiner gleich deinem Sigma ist. Und speicher für jeden Schritt das aktuelle Minimum.

Grüße


----------



## ania (9. Juli 2010)

Hi,

danke für eure Antworten. Ich werde dann mal mein Glück versuchen.

Viele Grüße,
ania


----------



## ania (14. Juli 2010)

Hallo, 

also ich konnte das Problem mit dem Durchsuchen einer Matrix bisher super lösen. Nun habe ich leider ein weiteres kleines Problem. Ich möchte nämlich die Werte für mein Array aus einer Text Datei namens "B_data.txt" zeilenweise herauslesen und in gradB[j][k] speichern. Mein C-Code sieht folgendermaßen aus:

```
#include <stdio.h>

int main ()
{
	int rows,columns,j,k;
	rows = 3;
	columns = 6;
	FILE* fp;                          /* pointer to the txt file */
	int gradB[j][k];

fp = fopen("B_data.txt","r");

	for(j = 0; j < rows; j++)                                   /* Zeilen durchlaufen */
{
		for(k = 0; k < columns; k++)                /* Spalen durchlaufen */
  	{
        	fscanf(fp, "%f", &gradB[j][k]);
}}
    
	  printf("%d\n",gradB[1][1]);                      /* hier möchte ich als Test das erste Element der Matrix ausgegeben bekommen */

}
```

Der Code lässt sich fehlerfrei kompilieren (xemacs), nur leider bekomme ich beim Ausführen (in der Konsole) immer folgende Fehlermeldung :  "Speicherzugriffsfehler". Ich kann mit dieser Fehlermeldung leider überhaupt nichts anfangen. Ich wäre wirklich sehr dankbar, falls mir da jemand helfen kann. Der Inhalt der Text Datei sieht so aus:
1 2 3 4 5 6 
2 3 4 5 6 7
3 4 5 6 7 8 

Das hier ist jetzt aber nur eine kleine Test_Matrix. Später sollen da eigentlich keine integer Werte drin stehen, sondern double Werte. 

Viele Grüße,
ania


----------



## badday (14. Juli 2010)

Benutze doch bitte die Tags.
Zum Code:

```
int gradB[j][k];
```

Hier haben weder j noch k einen Wert zugeordnet bekommen. Meintest du rows und colums?

Gruß,

badday


----------



## MCoder (14. Juli 2010)

ania hat gesagt.:


> ```
> int gradB[j][k];
> ```


Mich wundert's, dass sich diese Zeile überhaupt kompilieren  lässt.

Gruß
MCoder


----------



## timestamp (14. Juli 2010)

Das erste Element eines Arrays ist übrigens array[0] und nicht array[1].


----------



## ania (14. Juli 2010)

@ MCoder,

müsste es vielleicht     _  int gradB[6][3] _   heißen? Naja, jedenfalls habe ich wirklich keine Fehlermeldung beim kompilieren bekommen. Was die kleinen Fehler bei mir angeht: ich habe das letzte Mal vor Jahren etwas programmiert und das auch nur halbherzig. Von daher kann es immer mal wieder sein, dass ich (leider) solche Fehler mache. Aber ich versuche mein bestes, hehe.


@ timestamp,

du hast natürlich Recht. Mir geht es eigentlich nur darum zu prüfen, ob das Einlesen der Matrix auch wirklich geklappt hat, und deswegen wollte ich mir irgendein Element mal ausgeben lassen, welches genau ist mir dabei egal.

Vg,
ania


----------



## badday (14. Juli 2010)

@MCoder: Nein, warum sollte das nicht kompiliert werden?


> müsste es vielleicht  int gradB[6][3]  heißen?


Oder eben gradB[columns][rows]

Gruß,

badday


----------



## ania (14. Juli 2010)

Nachdem ich das mit gradB ausgebessert habe, bekomme ich zwar kein Speicherzugriffsfehler mehr, allerdings bekomme ich als Ausgabe für gradB[1][1] immer eine "0" , obwohl es eine "2" sein sollte...hmmmmm

Stimmt vielleicht das fscanf nicht?

VG,
ania


----------



## Nadriel (14. Juli 2010)

ania hat gesagt.:


> printf("%d\n",gradB[1][1]);                      /* hier möchte ich als Test das erste Element der Matrix ausgegeben bekommen */



Du willst doch das erste Element ausgeben, das erste Element ist aber gradB[0][0].

Grüße Nadriel


----------



## timestamp (14. Juli 2010)

Nadriel hat gesagt.:


> Du willst doch das erste Element ausgeben, das erste Element ist aber gradB[0][0].
> 
> Grüße Nadriel



Das Problem haben wir weiter oben schon geklärt.


----------



## MCoder (14. Juli 2010)

badday hat gesagt.:


> @MCoder: Nein, warum sollte das nicht kompiliert werden?


Weil für die Festlegung der Feldgrößen eigentlich nur konstante Werte erlaubt sind und keine Variablen.

Gruß
MCoder


----------



## deepthroat (15. Juli 2010)

Hi.





MCoder hat gesagt.:


> Weil für die Festlegung der Feldgrößen eigentlich nur konstante Werte erlaubt sind und keine Variablen.


Das kommt auf die Sprache an.

In C++ ist es nicht erlaubt.

In C89, C90 ist es nicht erlaubt.

In C99 gibt es Arrays mit variabler Länge; da wäre der Code OK.

Der GCC erlaubt Arrays mit variabler Länge als Erweiterung auch in C90 und C++ (siehe http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html).

Gruß


----------

