[Erledigt] Typische Funktion zum errechnen des Array.Size komisch?


#1

Also ich habe gerade mal zum üben ein paar Prüfungsaufgaben der letzten Jahre lösen wollen um mich ein wenig auf die in 2 Wochen kommenden Prüdungen vorzubereiten. Darin war u.a. eine Aufgabe in der es galt eine Visa-Card Nummer zu überprüfen. Aufgabe schonmal nicht schwer, also rangesetzt und losgelegt.

  1. Bedingung Nummer darf nicht kleiner/größer sein als 16 Zeichen. OK kein Thema dacht ich mir, leg ich ein int-Array an welche die Nummer beinhaltet. Und dann kam ein kleines Makro von mir zum Einsatz womit ich die Größe eines Arrays in C und C++ herausfinden kann(Hat bisher immer funktioniert!) und da ist das Problem: Ich bekomme immer 1 als Ergebnis. Warum? Habe zum erstenmal mit DevCpp auf Windoof entwickelt, sonst nutze ich MS Visual Studio C++ Express Edition. Liegt es am Mingw-Compiler der ja in DevCpp verwendet wird? Hier kurz bisschen QC zum nachvollziehen was ich eigentlich will:
// ...
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*(x)))
// ...

// main()
// ...
int visanr[] = {0, 6, 9, 9, 0, 0, 4, 3, 1, 3, 1, 3, 9, 6, 4, 2};
if(isValidVisa(visanr)) {
   cout << "Is Valid!" << endl;
}
// ...

// isValidVisa(int nr[])
// ...
int length = ARRAY_SIZE(nr);
if(length != VISA_MAX_LENGTH) {
   return(false);
}
// ...

Vielleicht hatte schonmal jemand dieses Phänomen und weiß woran es lag? Ich steh momentan aufm Schlauch.

Gut Schuß
VuuRWerK :wink:


#2

Die Funktion isValidVisa bekommt ja mit int nr[] nur einen pointer übergeben und sonst nichts.
Sie hat gar keine Möglichkeit zu wissen, wie viel da noch dahintersteckt.


#3

Ach Mensch na klar, ich bin doch ein Depp … :twisted: :smiley:

Ok habs umgebaut, und damit die Nachwelt auch was von hat, hier der komplette Algo zum testen auf eine Gültige Visa-Card-Nummer(falls es mal jemand brauch :slight_smile: ):

#include <cstdlib>
#include <iostream>

#define VISA_MAX_LENGTH 16

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*(x)))

using namespace std;

bool isValidVisa(int nr[], int length);

int main(int argc, char *argv[])
{
    int visanr[] = {0, 6, 9, 9, 0, 0, 4, 3, 1, 3, 1, 3, 9, 6, 4, 2};
    if(isValidVisa(visanr, ARRAY_SIZE(visanr))) {
         cout << "Is Valid!" << endl;
    }
    cin.sync();
    cin.clear();
    cin.get();
    return(EXIT_SUCCESS);
}

bool isValidVisa(int nr[], int length) {
     if(length != VISA_MAX_LENGTH) {
               return(false);
     }
     cout << "Beispiel:	";
     for(int i = 0; i < VISA_MAX_LENGTH; i++) {
           cout << nr**;
     }
     cout << endl;
     int _tmp = 0;
     for(int i = 0; i < VISA_MAX_LENGTH; i++) {
           if((i % 2) == 0) {
                nr** <<= 1;
                if(nr** > 9) {
                     nr** -= 9;
                }
           }
           _tmp += nr**;
     }
     cout << "Ergebnis: " << _tmp << endl;
     return(true);
}

Danke für den Gedankenanstoß!

Gut Schuß
VuuRWerK :wink: