
Ich habe unter diesem Link einen C-Code gefunden, der für das, was ich tun möchte, sehr nützlich wäre:Alle möglichen Kombinationen aus Buchstaben und Zahlen
#include <stdio.h>
//global variables and magic numbers are the basis of good programming
const char* charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char buffer[50];
void permute(int level) {
const char* charset_ptr = charset;
if(level == -1){
puts(buffer);
}else {
while(buffer[level]=*charset_ptr++) {
permute(level - 1);
}
}
}
int main(int argc, char **argv)
{
int length;
sscanf(argv[1], "%d", &length);
//Must provide length (integer < sizeof(buffer)==50) as first arg;
//It will crash and burn otherwise
buffer[length]='\0';
permute(length - 1);
return 0;
}
Wenn ich jedoch versuche, es wie vorgeschlagen zu kompilieren, erhalte ich folgende Fehler. Kann mir bitte jemand helfen, das Problem zu beheben?
$ make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
make: Nothing to be done for 'permute'.
./permute: line 3: //global: No such file or directory
./permute: line 4: const: command not found
./permute: line 5: char: command not found
./permute: line 7: syntax error near unexpected token `('
./permute: line 7: `void permute(int level) {'
Auch wenn ich versuche, gcc zu verwenden, erhalte ich einen Segmentierungsfehler:
$ mv permute permute.c
$ gcc permute.c -o permute.bin
$ chmod 755 permute.bin
$ ./permute.bin
Segmentation fault (core dumped)
Antwort1
Anscheinend hatten Sie die C-Datei zunächst mit „“ benannt permute
. Als dies make
fehlschlug, versuchten Sie, sie mit Ihrer Shell auszuführen, was zu all diesen Syntaxfehlern führte (da die Shell nicht weiß, wie C-Code ausgeführt wird).
Im zweiten Fall treffen Sie auf den Kommentar:
//Muss als erstes Argument die Länge (Integer < sizeof(buffer)==50) angeben;
//Sonst wird es abstürzen und verbrennen
weil Sie dem Programm kein erstes (oder überhaupt kein) Argument übergeben haben. Versuchen Sie es ./permute.bin 10
.
Antwort2
Im ersten Fall sieht es so aus, als ob Sie den C-Code gespeichert haben permute
und dann versucht haben, ihn auszuführen
make CFLAGS=-O3 permute && time ./permute 5 >/dev/null
Da es kein Makefile
Ziel für gibt make
, wurde es ohne Fehler beendet und die informative Meldung ausgegeben.
Für „Permute“ kann nichts getan werden.
Da make
kein Fehlercode zurückgegeben wurde, time ./permute 5 >/dev/null
wurde der zweite Teil des Befehls () ausgeführt. Da permute
es sich um Quellcode und nicht um eine ausführbare Binärdatei handelt, wurde es als Shell-Skript interpretiert, was zu folgender Ausgabe führte:
./permute: line 3: //global: No such file or directory
./permute: line 4: const: command not found
./permute: line 5: char: command not found
./permute: line 7: syntax error near unexpected token `('
./permute: line 7: `void permute(int level) {'
Bessere Anweisungen wären, den C-Quellcode zu speichern permute.c
und dann den folgenden Befehl auszuführen, um ihn zu kompilieren (und eine Verknüpfung mit den erforderlichen Bibliotheksdateien herzustellen):
gcc -O3 -o permute permute.c
Dadurch wird permute
eine ausführbare Binärdatei erstellt, die beispielsweise ausgeführt werden kann:
./permute 2