- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的最终目标是打开一个像这样的游戏的游戏板:http://www.rci-jeux.com/jeux/labychiffres/laby.swf然后把它当作大学作业来玩(我在国外,不能总是听懂讲师所说的一切)。
我的问题是我认为在pile.c
中 - 下面的第三个代码块。我已经用 gdb 识别出了这一点(我对此非常缺乏经验):(我已经从代码中删除了注释,因此行号不正确 - 但它仍然在它引用的行上显示 DEBUGGING PROBLEM
) .
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400ee6 in afficher_pile (pile=...) at pile.c:48
48 afficher(P_elt->valeur);//########DEBUGGING PROBLEM
在我看来,这个非常简单的 afficher
(打印)函数指的是不应该的东西,但我基本上(按照讲师的建议)编辑了一些简单的字符串操作函数为我们提供了,其中类型或结构是一个字符和一个指向下一个字符的指针,并且链的末尾有(如果我理解正确的话)一个NULL
指针。
我对编程非常陌生,但我们对结构有相当广泛的指导,因此它们应该是适当和正确的(pile.c
函数也应该如此)。
最初,我以为我错误地传递了元素的 valeur
部分,因此我尝试以各种方式更改 afficher(P_elt->valeur);
:
afficher(P_elt.valeur);
afficher(*P_elt.valeur);
afficher(&P_elt.valeur);
这三个不会编译说member valeur in some not a struct or union
afficher(&P_elt->valeur);
编译错误:预期为“POSITION”,但参数类型为“struct POSITION *
afficher(*P_elt->valeur);
编译错误:一元“*”的类型参数无效(具有“POSITION”)
我寻找过这样的问题:C - Segfault when accessing member of non null pointer struct
C segmentation fault when trying to implement LinkedList (我对此充满希望,但我不认为这是我的错误,我确信我的代码确实使用 NULL 指针初始化了结构。)
基本上我还没有找到其他可以尝试的东西,并且希望在最后有机会与讲师一起探讨事物之前取得更多进展。
1.proj.h
头文件(注意,其中包含一些我尚未编写的函数的原型(prototype)。)
2.proj.c
将是主文件,还没有太大进展。
3.pile.c
包含 gdb 突出显示的导致段错误的代码,还用于操作最终玩家和解算器用于解决游戏的位置列表。
4.allocate_plat.c
这会读取一个游戏文件(程序之前会从游戏文件加载并显示网格。)这可能就是问题所在,因为 PILE 结构是在此处初始化的使用游戏板中的值。
5.makefile
可能不是必需的,但之前发现存在问题。
6.plateau1.txt
这似乎正确复制到文本编辑器中(至少从预览来看 - 不应该有尾随空格(尽管我不知道这是否重要))。
1.proj.h
#pragma once
typedef struct position_st{
int indl;//indice of ligne
int indc;//indice of colonne
}POSITION;
typedef struct element_st{
POSITION valeur;
struct element_st *P_suivant;
}ELEMENT;
typedef struct pile_st{
ELEMENT * P_sommet;
}PILE;
//##########PLATEAU STRUCTURE DEFINITION##############
typedef struct plat_st{
//########## INFORMATION INCLUDED IN AND READ FROM THE GAME FILE
int nl;//number of lignes in grille
int nc;//number of colonnes in grille
POSITION dep;//position du depart: dep.indl and dep.indc
POSITION arr;//position d'arrive: arr.indl and arr.indc
int longdem;//longueur demandee
int sumdem;//totale demandee
int ** grille;//Playing grid done by analogy with matrix
//#######INFORMATION TO DO WITH THE CURRENT GAME ########
int longcur;//longueur courant
int sumcur;//totale courant
PILE chemin;//The path
}PLATEAU;
//########## FUNCTION PROTOTYPES and source files ###############
//allocate_plat.c allocate_plat.c allocate_plat.c allocate_plat.c
//allouer allocates the variables for the game
int allouer(PLATEAU *, int, int, int, int, int, int, int, int);
//lire reads a game from a file
int lire(char *, PLATEAU *);
//affiche prints grille
void affiche_grille(PLATEAU);
//pile.c pile.c pile.c pile.c pile.c pile.c pile.c pile.c pile.c
//FONCTIONS DE PILE ETC
int afficher (POSITION); prints position
ELEMENT* nouvel_element (POSITION);
void initialiser_pile(PILE *);
int est_vide (PILE);
int afficher_pile (PILE);
int longueur_pile (PILE);
ELEMENT* empiler(PILE *, ELEMENT *);
ELEMENT* depiler (PILE *);
POSITION lire_sommet (PILE *);
//grille.c grille.c grille.c grille.c grille.c grille.c grille.c
// GRILLE.C FONCTIONS DE GESTION DE LA GRILLE
int lire_valeur_a(PLATEAU *,POSITION *);
int lire_passage_a(POSITION);
int lire_direction_a(POSITION);
int ecrire_passage_a(POSITION);
int ecrire_direction_a(POSITION);
2.proj.c
#include <stdio.h>
#include <stdlib.h>
#include "proj.h"
int main(int argc, char* argv[]){
int choix, choix2, succes;
PLATEAU jeu;
ELEMENT *P_elt;//////////// ELEMENT HERE *P_elt
if (argc == 1){
printf("Erreur : argument manquant !\n");
return EXIT_FAILURE;
}
char *nom_fichier = argv[1];
succes=lire(nom_fichier, &jeu);
if (!succes){
printf("Erreur lors de la lecture du fichier !\n");
return EXIT_FAILURE;
}
afficher_pile(jeu.chemin);
if (est_vide(jeu.chemin) == 0){
printf("Chemin vide\n");
}
printf("%d. this is 0 if chemin not empty",est_vide(jeu.chemin));
affiche_grille(jeu);
afficher_pile(jeu.chemin);
if(!est_vide(jeu.chemin)) afficher(lire_sommet(&jeu.chemin));
printf("\n");
return 0;
}
3.pile.c
#include <stdio.h>
#include <stdlib.h>
#include "proj.h"
////////// AFFICHER POSITION ////////////////////////////
int afficher(POSITION v){
printf("\t%d %d", v.indl,v.indc);
}
///////// NOUVEL_ELEMENT /////////////////////////////
ELEMENT *nouvel_element (POSITION nouvelle_valeur){
ELEMENT *P_elt;
P_elt =(ELEMENT*) malloc(sizeof(ELEMENT));
if(P_elt ) {
P_elt->valeur= nouvelle_valeur;
P_elt->P_suivant=NULL;
}
return P_elt;
}
/////////////////////////////////////////////////////
void initialiser_pile(PILE *P_pile){
P_pile->P_sommet=NULL;
}
////////////EST VIDE /////////////////////////////////////////
int est_vide (PILE pile){
return pile.P_sommet == NULL;//i.e. true (non-zero) if P_sommet is NULL
}
////////// AFFICHER PILE PRINT PATH //////////////////
int afficher_pile (PILE pile){
ELEMENT *P_elt;
int l=0;
for(P_elt= pile.P_sommet ; P_elt!=NULL ; P_elt=P_elt->P_suivant, l++ )
afficher(P_elt->valeur);//######## DEBUGGING PROBLEM #################
return l;
}
/////////// LENGTH OF PATH //////////////////////////
int longueur_pile (PILE pile){
ELEMENT *P_elt;
int l=0;
for(P_elt= pile.P_sommet ; P_elt!=NULL ; P_elt=P_elt->P_suivant )
l++;
return l;
}
///////////EMPILER ADD ELEMENT TO PATH //////////////
ELEMENT* empiler(PILE *P_pile, ELEMENT *P_elt_ajoute){
P_elt_ajoute ->P_suivant = P_pile->P_sommet; /*on chaine P_elt_ajoute a la suite */
P_pile->P_sommet = P_elt_ajoute; /*on chaine la sommet a P_elt_ajoute */
return P_elt_ajoute;
}
/////////DEPILER REMOVE ELEMENT FROM PATH///////////
ELEMENT* depiler (PILE *P_pile){
ELEMENT *P_elt_supprime;
/* Si la pile est vide */
if (est_vide(*P_pile))
return NULL;
/* Si la pile n'est pas vide */
P_elt_supprime=P_pile->P_sommet ;
P_pile->P_sommet = P_elt_supprime->P_suivant; /*on chaine la sommet a la suite */
P_elt_supprime->P_suivant=NULL; /* on supprime le chainage de P_elt_supprime */
return P_elt_supprime;
}
//*
/////////////// LIRE SOMMET ////////////////////////
POSITION lire_sommet (PILE *P_pile){
ELEMENT *P_elt;
// if (est_vide(*P_pile))
// return NULL; //sortie fonction
for(P_elt = P_pile->P_sommet; P_elt->P_suivant != NULL; P_elt = P_elt->P_suivant);
return P_elt->valeur;
}
4.allocate_plat.c
中间包含一些重复的 fscanfs,我确信它们可以工作。
#include <stdio.h>
#include <stdlib.h>
#include "proj.h"
int allouer(PLATEAU *PLAT, int nl, int nc, int ldep, int cdep, int larr, int carr, int longdem, int sumdem){
int i,succes;
PLAT->grille = (int**)calloc(nl,sizeof(int*));
PLAT->nl = nl;
PLAT->nc = nc;
PLAT->longdem = longdem;
PLAT->sumdem = sumdem;
PLAT->dep.indl = ldep;
PLAT->dep.indc = cdep;
PLAT->arr.indl = larr;
PLAT->arr.indc = carr;
succes = (PLAT->grille != NULL);
for (i=0; succes && i<nl;i++){
PLAT->grille[i]=(int*)calloc(nc,sizeof(int));
succes = (PLAT->grille[i] != NULL);
}
return succes;
}
int lire(char *nom_fichier, PLATEAU *PLAT){
int i,j,succes, c;
FILE *fp;
fp = fopen(nom_fichier, "rt");
if(fp==NULL) {
printf("Erreur d'ouverture du fichier\n");
return 0;
}
c = fscanf(fp,"%d %d",&PLAT->nl,&PLAT->nc);//Read first line
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
c = fscanf(fp,"%d %d",&i,&j);//Read second line
PLAT->dep.indl=i-1;
PLAT->dep.indc=j-1;
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
c = fscanf(fp,"%d %d",&i,&j);//Read third line
PLAT->arr.indl=i-1;
PLAT->arr.indc=j-1;
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
c = fscanf(fp,"%d %d",&PLAT->longdem,&PLAT->sumdem);//Read fourth line
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
if( c != 2){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
//ALLOCATE THE FILE TO THE STRUCT
succes = allouer(PLAT, PLAT->nl, PLAT->nc, PLAT->dep.indl, PLAT->dep.indc, PLAT->arr.indl, PLAT->arr.indc, PLAT->longdem, PLAT->sumdem );
if(succes==0) {
printf("Erreur d'allocation\n");
fclose(fp);
return 0;
}
for(i=0; i< PLAT->nl; i++){
for(j=0; j<PLAT->nc; j++){
c=fscanf(fp, "%d", &PLAT->grille[i][j]);
if(c != 1){
printf("Erreur de format de fichier\n");
fclose(fp);
return 0;
}
}
}
fclose(fp);
ELEMENT *P_sommet = nouvel_element(PLAT->dep);
if (P_sommet==NULL){
printf("Erreur d'allocation\n");
return 0;
}
empiler (&PLAT->chemin,P_sommet);
PLAT->longcur=1;
PLAT->sumcur=PLAT->grille[PLAT->dep.indl][PLAT->dep.indc];
//ABOVE LINE INITIALISES THESE THINGS WHEN THE FILE IS READ
return 1;
}
//AFFICHE - PRINT GRILL ONLY
void affiche_grille(PLATEAU jeu){
int i,j;
printf("\nEtat du jeu\n");
for(i=0; i < jeu.nl; i++){
for(j=0; j < jeu.nc; j++){
if (jeu.dep.indl == i && jeu.dep.indc == j){
printf("D %d\t", jeu.grille[i][j]);
}
else if (jeu.arr.indl == i && jeu.arr.indc == j){
printf("%d A\t", jeu.grille[i][j]);
}
else printf("%d\t",jeu.grille[i][j]);
}
printf("\n");
}
printf("\n");//Final new line
}
5.makefile
CC = gcc
CFLAGS = -I . #-Wall
DEPS = proj.h
OBJ = proj.o allocate_plat.o pile.o grille.o
%.o: %.c $(DEPS)
$(CC) $(CFLAGS) -g -c -o $@ $<
proj: $(OBJ)
gcc $(CFLAGS) -g -o $@ $^
6.示例游戏文件plateau1.txt
,第一行是#行和列,第二行和第三行起始和结束坐标,第四行是所需的路径长度以及所需的网格值和最后4个的总和线条是网格。
4 4
1 1
4 4
11 96
10 13 2 5
3 15 9 4
8 6 11 14
7 12 1 16
最佳答案
您有很多未初始化的指针。例如,您永远不会调用initialiser_pile
。 – 巴尔马尔
在 allocate_plat
中 lire
末尾的 empiler
之前调用 initialiser_pile
会有所帮助,谢谢。不再是段错误。 – Luskentyrian
关于代码可以编译,但在与游戏板一起运行时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27410804/
是否有任何库或框架旨在促进从另一种成熟的编程语言中构建项目? 在 C++、java 等编程语言中指定逻辑、集合和复杂规则非常容易,但在 Makefile 中完成这些事情似乎是一场艰苦的战斗。我还没有深
我有这段代码可以用 clang 编译得很好(即使使用 -Weverything),但是 gcc 会发出错误。 #include #include #include using namespace
我有以下 block 头文件 BKE_mesh.h: /* Connectivity data */ typedef struct IndexNode { struct IndexNode *
我在我的一个项目中遇到了一个奇怪的问题。我的代码库依赖于一个外部库,其中包含一个名为 Dataset 的类. Dataset类私有(private)继承自 std::vector (其中 Sample
当使用 gcc、g++ 或 make 在终端中编译一个小型 C 或 C++ 项目时,我收到以下错误: /tmp/ccG1caGi.o: In function `main': main.c:(.tex
我正在尝试从 CVS 为 Windows 上的 Emacs 23.1.50 编译 CEDET,但在“第 6 步:打开 EDE...”时出现错误:“defvar:作为变量的符号值是无效的:cedet-m
我正在(重新)学习编程,我从 C 开始。我的 IDE(如果我可以这么说)是 Windows7 上的 cygwin(32 位)和 Visual-Studio 2010。我总是编译我用 gcc (cygw
我喜欢在模板类中使用本地类来执行类似“static if”的构造。但是我遇到了 gcc 4.8 不想编译我的代码的问题。但是 4.7 可以。 这个例子: #include #include #in
我有一个项目,必须仅使用 java 1.4 进行编译。但我计划使用mockito 编写一些单元测试。我想要一种在 pom 中指定的方法,以便 src/main/java 使用 jdk 1.4 编译,但
我想了解 PHP 编译过程是如何工作的。 假设我有一个名为funcs.php 的文件并且这个文件有三个函数,如果我include 或require 它,所有的在文件加载期间编译三个函数?或者源代码会被
编译工具链 我们写程序的时候用的都是集成开发环境 (IDE: Integrated Development Environment),集成开发环境可以极大地方便我们程序员编写程序,但是配置起来
当我编写一些 Scala 代码时,在尝试编译代码时收到一条奇怪的错误消息。我将代码分解为一个更简单的代码(从语义的角度来看这完全没有意义,但仍然显示了错误)。 scala> :paste // Ent
我正在编译一个 SCSS 文件,它似乎删除了我的评论。我可以使用什么命令来保留所有评论? >SASS input.scss output.css 我在 SCSS 中看到两种类型的注释。 // Comm
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
当您编译 grails war 时,我知道 .groovy 代码被编译为字节码类文件,但我不明白容器(例如 tomcat)如何在请求 GSP 时知道如何编译它们。容器了解 GSP 吗?安装在服务器上的
我正在努力将多个文件编译成一个通用程序。我收到一个错误: undefined reference to 'pi' 这是我的代码和 Makefile 的框架。我做错了什么?谢谢! 文件:calcPi.c
我尝试使用 LD_PRELOAD 来 Hook sprintf function ,所以我将打印到缓冲区的结果: #define _GNU_SOURCE #include #include int
我正在寻找最简单的方法来自动将 CoffeeScript 重新编译为 JS。 阅读documentation但仍然很难得到我想要的东西。 我需要它来监视文件夹 src/ 中的任何 *.coffee 文
我想使用定制waveformjs 。我发现this on SO但是,我不知道如何编译/安装波形来开始。我从 GitHub 克隆它并进行了更改,但是我不知道如何将其转换为 .js 文件。 最佳答案 为了
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!