Pemrograman C - ukuran array berdasarkan argumen baris perintah

Saya mencoba membuat kotak untuk permainan papan, saya tahu ukuran maksimum papan tersebut, namun bisa juga lebih kecil berdasarkan apa yang dimasukkan pengguna di baris perintah. Saya telah membuat program berikut, berhasil dikompilasi tetapi ketika saya menulis dimensi ke dalam baris perintah dikatakan 'Kesalahan segmentasi (inti dibuang)'. Adakah yang bisa memberi tahu saya kesalahan apa yang saya lakukan?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BOARD_WIDTH 80
#define BOARD_HEIGHT 52

int i;
int j;
int width;
int height;
int generations;
int grid[BOARD_WIDTH][BOARD_HEIGHT];

int main(int argc, char *argv[])
 {

if (argc < 2)
{
 printf("Not enough arguments entered\n");
 exit(1);
 }
else
{
 width = atoi(argv[2]);
 height = atoi(argv[3]);
 generations = atoi(argv[4]);
 }
for(i=0;i<width;i++)
for(j=0;j<height;j++)

printf("%2d", grid[i][j]);
}

person Ibz    schedule 14.05.2013    source sumber
comment
Apa baris perintah Anda? Program Anda akan crash jika Anda hanya memasukkan 2 argumen.   -  person Klas Lindbäck    schedule 14.05.2013
comment
@klas baris perintah saya adalah ./gol 7 6 5   -  person Ibz    schedule 14.05.2013
comment
Maka Anda harus atoi argv[1], argv[2] dan argv[3]. Baca dan ikuti petunjuk dalam jawaban Salgar.   -  person Klas Lindbäck    schedule 14.05.2013
comment
@KlasLindbäck oke terima kasih banyak   -  person Ibz    schedule 14.05.2013


Jawaban (4)


Banyak hal

Anda telah menetapkan BOARD_WIDTH dan BOARD_HEIGHT tetap saat Anda mendeklarasikan variabel, jadi jika Anda memasukkan nilai yang lebih tinggi dari nilai pada baris perintah, hal tersebut tidak akan berfungsi.

Tapi kebanyakan apa yang ingin Anda cetak? Anda belum menginisialisasi grid ke sesuatu yang spesifik, jadi Anda mencetak memori acak.

Pertama, Anda harus menginisialisasi grid Anda dengan menggunakan 'baru': Lihat di sini Buat array 2D dengan dimensi berukuran variabel

Kemudian, Anda harus menginisialisasi variabel tersebut menjadi sesuatu. Kemudian Anda dapat mencetaknya.

Akan lebih mudah untuk membantu Anda jika Anda menunjukkan kepada kami apa yang Anda masukkan ke dalam program. Namun semua alasan di atas adalah sebuah permulaan.

Juga akan macet jika Anda tidak meneruskan 3 argumen ke program, karena Anda menggunakan 3.

Meskipun Anda menggunakan argv[2] hingga argv[4] - Anda harus menggunakan argv[1] hingga argv[3]. Jadi dalam kondisi saat ini, ia akan crash kecuali Anda melewati 4 argumen.

person Salgar    schedule 14.05.2013
comment
JUGA, Anda memeriksa apakah argc ‹ 2, tetapi Anda menggunakan 3! seharusnya jika argc ‹ 4 - person Salgar; 14.05.2013
comment
terima kasih saya menggunakan argv[1] hingga argv[3] sekarang. Saya meneruskan ini ke dalam program ' ./gol 7 6 5 ' mengharapkan grid dengan lebar 7 dan tinggi 6 muncul, saya tidak menyadari saya harus menginisialisasi grid. maaf saya baru mengenal pemrograman. Saya tidak yakin apa yang Anda maksud dengan saya harus menginisialisasi variabel-variabel itu menjadi sesuatu sebelum mencetaknya - person Ibz; 14.05.2013
comment
grid memiliki cakupan file, sehingga diinisialisasi ke semua 0s. new adalah C++, tetapi pertanyaannya diberi tag C. - person Daniel Fischer; 14.05.2013
comment
@DanielFischer, oh benar, apakah itu berarti saya tidak perlu menginisialisasi grid, saya ingin membiarkan seluruh grid kosong seperti pada spasi dan mencetak batas di bagian luar - person Ibz; 14.05.2013
comment
@Ibz Spaces bukan 0s. Tanpa inisialisasi eksplisit, grid diinisialisasi ke semua 0, jadi jika Anda menginginkan hal lain di dalamnya, Anda harus menyetelnya di beberapa titik. - person Daniel Fischer; 14.05.2013

Pastikan ada sesuatu di argv[2], argv[3], argv[4] sebelum Anda menggunakannya. Mungkin seharusnya terbaca if(argc < 5) { exit(1); }

person edtheprogrammerguy    schedule 14.05.2013

Anda dapat memiliki 2 pendekatan untuk masalah Anda, pertama Anda dapat membuat array ukuran maksimum dan hanya menggunakan elemen aktif, kedua Anda dapat membuat array setiap kali permainan Anda dimulai. Untuk opsi ke-2 Anda perlu memberikan informasi input untuk ukuran game. Metode pertama sudah Anda terapkan (karena Anda memiliki tabel papan statis) jika Anda ingin membuatnya setiap kali permainan dimulai, cukup buat setelah mengubah nilai string menjadi bilangan bulat:

a = atoi(argv[2])
b = atoi(argv[3])
i = int[a][b]
person cerkiewny    schedule 14.05.2013
comment
menurut Anda metode yang mulai saya gunakan lebih mudah - person Ibz; 14.05.2013
comment
Perbedaan utama antara metode-metode tersebut menunjukkan kasus penggunaannya. Metode Anda bagus jika tabel akan sering digunakan dengan ukuran berbeda selama satu kali eksekusi program (program akan lebih cepat karena tidak ada alokasi memori tambahan yang akan digunakan), namun jika Anda akan menggunakan tabel hanya sekali lebih baik mengalokasikannya satu kali dengan nilai argumen. - person cerkiewny; 14.05.2013

Saya akan berasumsi bahwa kode yang Anda sajikan hanyalah cuplikan. Jika demikian, kecurigaan saya adalah masalah utama Anda adalah Anda menggunakan indeks yang salah untuk argumen Anda. Argumen pertama ada di indeks satu (nama file nol). argc kemudian adalah jumlah argumen termasuk nama file.

Dengan asumsi bahwa semua argumen yang Anda gunakan disajikan dalam cuplikan kode, Anda harus memiliki total empat indeks dengan lebar, tinggi, dan generasi masing-masing berada pada indeks 1, 2, dan 3.

person corahm    schedule 14.05.2013