Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 03:30

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Pointer -> Array

Discussion on Pointer -> Array within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
NRj™'s Avatar
 
elite*gold: 309
The Black Market: 119/0/0
Join Date: Jul 2011
Posts: 4,311
Received Thanks: 886
Smile Pointer -> Array

Hi,

mir geht es darum eine Zahl x in dem Feld f über den Pointer index zu finden. Ich bekomme aber in den Zeilen 16, 17 und 21 den Fehler: array subscript is not an integer

Ich weiß nicht mehr weiter. Der Datentyp index ist doch schon int.

Code:
NRj™ is offline  
Old 11/30/2015, 22:38   #2
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Du fängst mitten in der main() einfach mal ne neue funktion an, das kann schonmal nicht funktionieren.
Die Funktion hat kein einziges return, das geht auch nicht, ausser du änderst den Rückgabetyp zu void.

Also, die Funktion ausserhalb von main() definieren und innerhalb von main() mittels is_in(1, f, &index) aufrufen.

Danach kannst du daran arbeiten die Funktion zu verbessern, die ist nämlich so nicht zu gebrauchen. Das erste was mir auffällt ist das du index nie dereferenzierst und somit immer die Adresse von index verwendest.
.SkyneT. is offline  
Old 11/30/2015, 23:03   #3
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Du mischst hier char int und Zeiger, das da nichts funktioniert ist nicht verwunderlich.

Auch wenn C nicht so typstreng ist wie andere Programmiersprachen sollte man sich schon an die Typen halten und nicht einfach durcheinander werfen wie man will. Sowas
Code:
int index = 0;
...
index = &f;
darf nicht vorkommen &f ist der Zeiger auf f also eine 8, 16, 32 oder 64 bit Adresse, und int ist immer 32 bit, das heißt auf jeder anderen Architektur als 32 Bit wirst du damit Probleme haben.
und dann mit
Code:
f[index]
Fabrizierst du einfach nur einen riesigen Haufen Müll. Dieser Code entspricht
Code:
*(char*)(&f + index)// mit index = &f
*(char*)(&f+&f)
Und das das nicht funktionieren kann sollte klar sein.

Ich glaube du solltest mit C nochmal mit Kapitel 1 anfangen
warfley is offline  
Old 11/30/2015, 23:26   #4
 
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 445
Quote:
Du fängst mitten in der main() einfach mal ne neue funktion an, das kann schonmal nicht funktionieren.
Das geht sogar (aber nur mit GCC).

Was auch noch nicht geht: f ist gar nicht nullterminiert.
algernong is offline  
Old 11/30/2015, 23:40   #5
 
NRj™'s Avatar
 
elite*gold: 309
The Black Market: 119/0/0
Join Date: Jul 2011
Posts: 4,311
Received Thanks: 886
Ich habe das leicht abgeändert, aber weiter komme ich mit euren Tipps auch nicht:

bool is_in(int x, int f[MAX], int *index) ist in der Aufgabenstellung vorgegeben. x ist die Zahl, die in dem Feld f gesucht wird. Und über den Referenzparameter index soll die Stelle des Vorkommens bestimmt werden. Könnt ihr mir das bitte etwas einfacher erklären?
NRj™ is offline  
Old 12/01/2015, 00:03   #6
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Einen Array adressierst du über einen Index 0..ArrayLength-1, nicht über einen Zeiger. Das heißt index als int ist schon richtig, initialisiere den allerdings mit 0 und nicht mit der Adresse auf f.

Du übergibst dann den Zeiger auf index an deine Funktion, das hat den sinn das du diese bearbeiten kannst in der Funktion selbst und der wert erhalten bleibt, da C keine Vereinfachung von call by reference erlaubt (wie z.B. C++).
Allerdings musst du index in der Funktion dann auch als Zeiger behandeln und nicht als Integer.
also aus
Code:
f[index] ...
wird
f[*index]
oder
index = index+1
wird 
*index = *index+1
oder kürzer
*index++
außerdem gibt deine bool Funktion keinen wert zurück, wenn etwas gefunden wurde muss true zurückgegeben werden sonst false.

Nach dem Funktionsaufruf wird in index dann der Wert stehen den die Funktion zuletzt reingeschrieben hat (also wenn es gefunden wurde der index deines Elements)

und btw, seit wann kennt C den typen bool? Das ist mir neu, normalerweise verwendet man int für Wahrheitswerte mit x==0 ist false und x!=0 ist true

edit grade dein #define bool int gesehen
warfley is offline  
Old 12/01/2015, 00:04   #7
Moderator


 
elite*gold: 558
Join Date: Feb 2010
Posts: 6,544
Received Thanks: 1,424
Ich muss sagen, dein "int *index" ist mir nicht geheuer. Du benutzt deinen Zeiger als wäre es eine ganz normale Variable, also "int index". Da du den Zeiger aber nie als Zeiger verwendest, könnte das tatsächlich so funktionieren - aber gut ist das definitiv nicht.

Das fehlende "return" hast du bisher auch nicht korrigiert. Den Zeiger auf "index", den du in "main()" übergibst, kann es nicht geben, weil es "index" nicht gibt.

Quote:
Originally Posted by NRj™ View Post
bool is_in(int x, int f[MAX], int *index) ist in der Aufgabenstellung vorgegeben. x ist die Zahl, die in dem Feld f gesucht wird. Und über den Referenzparameter index soll die Stelle des Vorkommens bestimmt werden. Könnt ihr mir das bitte etwas einfacher erklären?
Ich versuche es mal: Du übergibst der Funktion deine Zahl x, von der du die Position in deinem Feld f haben willst. Außerdem übergibst du den Zeiger auf eine weitere Zahl, in der dann die Position gespeichert werden soll. Wenn du die Zahl x in dem Feld f findest, solltest true (ich nehme an 1 ? kann nur C++) zurück geben (return) und vorher die Position in index speichern (*index = pos; ). Solltest du sie nicht finden gibst du false (also 0 ?) zurück.

In main() siehst du dir dann den Rückgabewert an, also war es 1 oder 0, und gibst dann entsprechen "gefunden %index" oder "nicht gefunden" aus. Außerdem legst du dir dort vorher den Feld f, die Zahl x und die Zahl index an, von der du dann einen Zeiger an die Funktion übergibst.


So, ich hoffe ich habe nicht zu viel Blödsinn aufgeschrieben. Mit C habe ich bisher nichts gemacht und mein C++ ist auch noch ausbaufähig. Um dir noch genauer zu zeigen wie du das löst, müsste man wahrscheinlich die Lösung schreiben und das ist nicht ganz der Sinn der Sache.
ComputerBaer is offline  
Thanks
1 User
Old 12/01/2015, 18:35   #8

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define bool int

// Funktion is_in
bool is_in(int x, int f[MAX], int *index)  {
    
    for (*index = 0; f[*index] != '\0'; ++*index) 
    {
        if (f[*index] == x) 
        {
            break;
        }
    }

    return f[*index] != '\0';
}

int main(int argc, char *argv[]) {
    
    int f [MAX] = {1,2};
    int x []= {2};
    int index;

    bool ret = is_in(1, f, &index);
    
    if (ret)
        printf("\nDas x befand sich an der %d. Stelle", (*index)+1);
    else
        printf("\nIhr string enthaelt kein 'a'\n");

    return 0;
}
ComputerBaer liegt da ziemlich richtig, denke ich. Du sollst vermutlich zurückgeben ob ein Index gefunden wurde (deshalb der return-Wert) und dieser soll im index-Zeiger hinterlegt werden.

Du solltest dir ein bisschen mehr Mühe geben mit deinem Codestil und am Besten nochmal den Unterschied zwischen Zeigern und primitiven Datentypen wie Integern anschauen.
snow is offline  
Thanks
1 User
Old 12/03/2015, 20:56   #9

 
elite*gold: 0
Join Date: Feb 2008
Posts: 2,754
Received Thanks: 1,748
Quote:
Originally Posted by snow View Post
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define bool int

// Funktion is_in
bool is_in(int x, int f[MAX], int *index)  {
    
    for (*index = 0; f[*index] != '\0'; ++*index) 
    {
        if (f[*index] == x) 
        {
            break;
        }
    }

    return f[*index] != '\0';
        return
    }
    else {
        printf("\nDas x befand sich an der %d. Stelle", index+1);
    }
}

int main(int argc, char *argv[]) {
    
    int f [MAX] = {1,2};
    int x []= {2};
    int index;

    bool ret = is_in(1, f, &index);
    
    if (ret)
        printf("\nDas x befand sich an der %d. Stelle", (*index)+1);
    else
        printf("\nIhr string enthaelt kein 'a'\n");

    return 0;
}
ComputerBaer liegt da ziemlich richtig, denke ich. Du sollst vermutlich zurückgeben ob ein Index gefunden wurde (deshalb der return-Wert) und dieser soll im index-Zeiger hinterlegt werden.

Du solltest dir ein bisschen mehr Mühe geben mit deinem Codestil und am Besten nochmal den Unterschied zwischen Zeigern und primitiven Datentypen wie Integern anschauen.
Auch deine Variante gibt auch noch nichts zurück und dürfte aufgrund der fehlenden Anweisung hinter dem return auch nicht kompilieren.
Bin gerade am Handy und kann das deswegen nicht wirklich verbessern. Coden am Handy ist eine Qual, wie ihr bestimmt wisst.
Computerfreek is offline  
Thanks
1 User
Old 12/04/2015, 10:45   #10

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Mein Fehler, dieser Part:

Code:
    return
    }
    else {
        printf("\nDas x befand sich an der %d. Stelle", index+1);
    }
sollte eigentlich nicht mehr drinnen sein, ich habe es editiert.
snow is offline  
Reply


Similar Threads Similar Threads
[C++] Performance Problem mit Pointer-Array
09/08/2015 - C/C++ - 10 Replies
So Leute, ich mal wieder :D Heute geht es um etwas echt "heikles" und ich bin völlig ratlos, wieso das "so lange" dauert. Ich habe drei (beteiligte) Klassen, die wie folgt zusammenhängen: 1. Die Klasse AalVariable speichert einen Wert (oder mehrere Werte je nach "Benutzung"). Das heißt ein Objekt der Klasse AalVariable speichert einen Wert in einem std::vector<void*>. Wobei es zusätzlich ein zweites Array gibt, welches den Typ des abgespeicherten Wertes (string/long long/double)...
char array vom pointer mit srcpy changen
04/09/2015 - C/C++ - 10 Replies
Hey zusammen, also habe ein kleines problem das grad unnormal nervt:rtfm: Habe in einem game ein pointer der auf ein char array zeigt der pointer ist DWORD* F = (DWORD*)0x0076BBD8; // hier der pointer auf dem pointer ist jetzt ein char array drauf, nehmen wir einfach als beispiel "hey"
Multilevel Pointer hacken per Array [Fehlersuche]
05/06/2012 - AutoIt - 12 Replies
Hi Den Wert folgendes Level4-Pointers möchte ich mit einem Autoit-Script hacken: Base: 1073EF88 Offset1: 1C Offset2: 10 Offset3: 4 Offset4: DE4 Dazu habe ich dieses Tutorial gefunden, was beschreibt, wie man den Pointer per Array verwendet:
[C] Pointer auf Array
08/26/2009 - General Coding - 3 Replies
Hallo, Ich habe folgendende Pointer deklariert: char *Menu0 = {"Gerd","Egon","Juergen&q uot;,"Karl","Hans-Dieter",&quo t;Hans-Guenther"}; char *Menu1 = {"Anna","Inge","Franziska ","Lisa","Maria"}; usw..



All times are GMT +2. The time now is 03:30.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.