Index Pointer to Array

Posted By: Ayumi

Index Pointer to Array - 06/25/17 22:18

Hey,

anyone know, how to define a Pointer to one Array Index?

E.g:

Code:
typedef struct Weapon
{
  int Id;
} Weapon;
Weapon Weapons[10][3];

...

// Another Function...
void Anyone()
{
   Weapon* wp;
   wp = &Weapons[0][0];
}



Now, i have a Pointer to the Struct Array with Index 1(wp[1][0] -> index 2 etc)
But i only need a variable with ONE element of this array, to just use "wp" and not "wp[x][y]"...

Possible?
Posted By: Ch40zzC0d3r

Re: Index Pointer to Array - 06/25/17 22:26

Not sure if I got you right, your description is pretty weird..

Code:
Weapon *wp = &Weapons[4][2];
..
int myID = wp->Id;



Or do you actually want a pointer to only one row so you can do wp[secondIndexOnly] where wp is Weapons[firstIndex] ?
That would be:

Code:
Weapon *wp = Weapons[4];
..
int myID = wp[2].Id;

Posted By: Ayumi

Re: Index Pointer to Array - 06/25/17 22:31

Sorry, it s difficult to explain in english:D

I don t want set any Index and just use "wp" like a object in C#.
It is possible?

E.g:

Code:
Weapon *wp = Weapons[4];

wp.Id ...



because of readablity....

Code:
if(wp[i1][i2].Mdl == NULL)
{       
    ptr_remove(ent_create(wp[i1][i2].MdlHoloName , nullvector, NULL));
    wp[i1][i2].Mdl = ent_create(wp[i1][i2].MdlHoloName, nullvector, NULL);
}




Und in deutsch, weils einfach mal einfacher ist:D
Ich habe ein Struct Array. Das Array kann ich ja per Pointer ansteuern und auf den ersten index zugreifen, wie im Beispiel im ersten Post. Leider muss ich dem Pointer aber AUCH ein index mitgeben, was ich nicht will. C ist nicht C# und somit hab ich auch kein einzelnes Objekt.
Ich möchte also z.b. Index 2 als Structobjekt haben. Ein Struct wäre ja auch ein Objekt, aber kein Array.

Darum legte ich den Pointer auch so an:

Weapon *wp = &Weapons[0][0]; Weapon ist das Structobjekt, wie bei einem int Array eben eine einzelne Zahl.
Wenn ich das richtig sehe, wird nur der Umweg bleiben, einzelne Elemente im Struct anzusteuern, wie du das vorhin schon getan hast.

Posted By: Ch40zzC0d3r

Re: Index Pointer to Array - 06/25/17 22:47

Yes check my second code tag.
Heres another example:
Code:
int array[10][5];
array[4][2] = 69;

int *pArray4 = array[4];
printf("Test: %in", pArray4[2]);



EDIT: Du kannst auch einfach alles in defines oder funktionen wrappen
Posted By: Ayumi

Re: Index Pointer to Array - 06/25/17 22:57

Danke, glaub aber nicht, dass mein problem verstanden wurde.

Dein Beispiel ist zwar schon besser als mit 2 Indexern aber immer noch ein index zu viel. Ich möchte eine Art Objekt haben. Ein Pointer, der auf Adresse xy zeigt und den ich ohne Index nutzen kann.

Weapon *wp = &Weapons[0][0]; ...denn das hier ist ja auch nur ein Pointer auf Adresse 0 des Structarrays. Ich will aber einen Pointer auf Adresse XY, ohne dafuer noch den index angeben zu müssen. Wirst ja sonst wahnsinnig mit dem Code:D

D.h.
Weapon *wp = &Weapons[4][0]; wäre immer noch Index 0. Habs bereits probiert. (Meine Waffe, die eigentlich auf Index 4 liegt, ist in dem Fall Index 0)

EDIT:
Noch genauer ausgedrückt:
Statt "wp[0][2].Mdl" möchte ich gerne "wp.Mdl" nutzen, wobei wp ein Pointer des Structarrays von [0][2] wäre (bzw. genau jene Adresse)



Posted By: WretchedSid

Re: Index Pointer to Array - 06/26/17 00:47

Ähm, also so ganz versteh ich das nicht? Der index ist der offset in den array, nicht Adresse 0 (es sei denn der offset ist 0).

Weapon* wp = &Weapons[4][0];

Da, da ist deine Waffe.

printf("%d", wp->id); <- Kein index
Posted By: Ayumi

Re: Index Pointer to Array - 06/26/17 07:08

Dann versteh ich das aber auch nicht, weswegen ich ja hier nachfrage.
Vielleicht überseh ich aber einfach irgendwas?

"Adresse" meint im letzten Post nicht die Adresse im Speicher:D

Code:
typedef struct Weapon
{
  int Id;  
  STRING* Name;
  var KeyCode;  
  int IsCollected; 
  
  STRING* MdlName;
  STRING* MdlHoloName;
  ENTITY* Mdl;
   
} Weapon;
Weapon Weapons[10][3];


void InitWeapons()
{
   int i,j;
   for(i = 0; i< 10; i++)
   {
      for(j = 0; j< 3; j++)
   	{	
      	Weapons[i][j].Id = i+1;
      	Weapons[i][j].KeyCode = i+2;   
      }
   }
     
  	
   // Startwaffe   
   Weapons[0][0].MdlName = "UtMpi.mdl";	
   Weapons[0][0].Name = "Tactical Cardridge Weapon";
   Weapons[0][0].IsCollected = 1;
   // ....
}


// Erzeugt eine WaffeX Quants ueber dem Model. Wird vom Spieler eingesammelt und das Model im Struct gespeichert-
action CreateWeaponSpawn()
{
  while (!player) {wait (1);}  
  	
  int i;
  int i1 = (int)my.skill2;
  int i2 = (int)my.skill3;		
  ENTITY* ent;
  Weapon* wp;
  wp = &Weapons[i1][i2];
   
     if(wp.Mdl == NULL)
     {  
	ptr_remove(ent_create(wp.MdlName, nullvector, NULL));
	wp.Mdl = ent_create(wp.MdlName, nullvector, NULL);
	      		      
	while(wp.Mdl == NULL) { wait(1); }
	         	      
	set(wp.Mdl, INVISIBLE|PASSABLE|ZNEAR);
     }
			
     ent = ent_create(wp.MdlName, vector(my.x, my.y, my.z + 35), NULL);
     while(ent == NULL) { wait(1); }
     set(ent, PASSABLE);


}




In einer While wird dann nach Levelstart abgefragt, ob eine Taste gedrückt wurde.
Danach wird die Waffe zugeordnet.

Mit Weapons[x][y].Mdl = .... funktioniert das ganze auch, aber nicht per Pointer.

Code:
int i,j;
	for(i = 0; i < 10; i++)
	{  
		for(j = 0; j < 3; j++)
		{
		   if(Weapons[i][j].IsCollected) {
				//set(Weapons[i][j].Mdl, INVISIBLE);
			   //set(Weapons[i][j].Muzzle, INVISIBLE);	
		   }
   	}
	}
	

	reset(Weapons[wId1][wId2].Mdl, INVISIBLE);
   ActId.W1 = wId1;
   ActId.W2 = wId2;
   SetCrosshair(wId1,wId2);




EDIT: "Was funktioniert daran nicht?" Wird die Waffe eingesammelt und die entsprechende taste fuer die Waffe gedrückt, werden alle Waffen unsichtbar und die aktuell gewählte sichtbar. Mit obrigen Code wird Waffe 1 unsichtbar, Waffe 4 taucht aber gar nicht erst auf. Setze ich die Waffen nicht unsichtbar, so ist Waffe 4 wieder Waffe 1. Darum vermute ich, der Pointer zeigt auf Index 0.


EDIT2: Ich habe nochmal alle Daten geprüft. So, wie ich die Pointer und Abfragen gesetzt hatte MUSS es bereits korrekt sein, denn Index und Name scheinen richtig zu sein. ich muss den Fehler wohl in meinem Code suchen.

Danke fuer die Hilfe.
Posted By: Ayumi

Re: Index Pointer to Array - 06/26/17 14:30

Hehe Fehler gefunden...

Ich habe insgesamt 3 x 10 Waffen als Struct initialisiert. Davon wurden aber erst 10 benannt (Name).

D.h. in der Schleife, die den Keycode abfragt, wird auch die zweite Dimension des Arrays durchlaufen. MDL ist null und darum wird auch nichts angezeigt:D

EDIT: War zu voreilig, wird aber irgendwas in der Richtung sein. Jedenfalls kann der Post abgehakt werden, weil die Pointer funktionieren.
© 2024 lite-C Forums