我正在尝试在C中创建一个生成随机数据的程序。它会生成随机数,并检查行中或列中或方块3x3中是否有相同的数字,如果没有,则将其放入单元格e进入下一个。唯一的问题是第5行,当索引为6时,它会产生分段错误。如果我在程序中注释时更改,则会循环播放。有什么问题?
include <string.h>
#include <stdlib.h>
#include "sudoku.h"
#include <stdio.h>
#include <time.h>
int dimension = 9;
int main(int argc, char** argv){
int dimension = 9;
int j ,k ;
int ** sudo = malloc(sizeof(*sudo)*dimension);
for ( j = 0; j< dimension; j++){
sudo[j] = malloc(sizeof(int)*dimension);
for ( k = 0; k<dimension; k++){
sudo[j][k] =0;
}
}
riempiSudoku(sudo);
return 0;
}
void riempiSudoku(int** sudo){ //fill sudoku
int i,j;
srand ( time(NULL));
srand(rand());
for (i=0;i<dimension;i++){
for(j=0;j<dimension;j++){
int ran;
do
ran= rand() %9 ;
while(checkSquare(sudo,i,j,ran+1)||checkRow(sudo,i,ran+1)
||checkCol(sudo,j,ran+1));
sudo[i][j] = ran+1;
printf("%d", sudo[i][j]);
}
printf("\n");
}
}
int checkRow(int** sudo, int row, int value){ //check if the number is in the row
int i;
for (i = 0; i<dimension; i++){
if (sudo[row][i] == value)
return 1;
}
return 0;
}
int checkCol(int** sudo, int col, int value){//check if the number is in the col
int i;
for (i = 0; i<dimension; i++){
if (sudo[i][col] == value)
return 1;
}
return 0;
}
int checkSquare(int** sudo, int row, int col, int value){ //check if the number is in the square 3x3
int i,j;
if (row==0||row==2||row==1){
if(col==0||col==1||col==2){
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
if(col==3||col==4||col==5){
for(i=0;i<3;i++){
for(j=3;j<6;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
if(col==6||col==7||col==8){
for(i=0;i<3;i++){
for(j=6;j<9;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
}
if (row==3||row==4||row==5){
if(col==0||col==1||col==2){
for(i=3;i<6;i++){
for(j=0;j<3;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
if(col==3||col==4||col==5){
for(i=3;i<6;i++){
for(j=3;j<6;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
if(col==6||col==7||col==8){
for(i=3;i<6;i++){
for(j=6;j<9;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
}
if (row==6||row==7||row==8){
if(col==0||col==1||col==2){
for(i=6;i<9;i++){
for(j=0;j<3;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
if(col==3||col==4||col==5){
for(i=6;i<9;i++){
for(j=3;j<6;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
if(col==6||col==7||col==8){
for(i=6;i<9;i++){
for(j=6;j<9;j++){
if (sudo[i][j] == value)
return 1;
}
}
return 0;
}
}
}
答案 0 :(得分:1)
In C, it is not correct to cast the return of [m][c][re]alloc()
C99 (或我所知道的任何其他C版本)不需要演员。 C隐式转换为void *
和来自void *
。演员然后自动完成
另一方面, C ++ 需要演员,因为它只会将转换为 int ** sudo = (int**) malloc(sizeof(int)*dimension);
for ( j = 0; j< dimension; j++){
sudo[j] = (int*) malloc(sizeof(int)*dimension);
,而不是来自的
对于初学者,然后更改代码的这一部分:
int ** sudo = malloc(sizeof(*sudo)*dimension);
for ( j = 0; j< dimension; j++){
sudo[j] = malloc(sizeof(int)*dimension);
致:
sizeof(*sudo)
注意:对于第一个malloc,指针空间所需的内存大小非常依赖于目标可执行文件,即32或64位,但在这种情况下def generate_sample(self, ob, preview):
print("* Generating sample...")
tone_out = array(ob, dtype=int16)
if preview:
print("* Previewing audio file...")
bytestream = tone_out.tobytes()
pya = pyaudio.PyAudio()
stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True)
stream.write(bytestream)
stream.stop_stream()
stream.close()
pya.terminate()
print("* Preview completed!")
else:
write('sound.wav', SAMPLE_RATE, tone_out)
print("* Wrote audio file!")
将适用于任何一个。