The tape is read from the file, and the MT program itself is also read from there. The essence of the MT program is to translate 0 to 1 and vice versa. Copes with the task, but at the end reports an error 
The conversion is in progress, but instead of writing to the file, it gives the specified error.
Please pay attention to one interesting fact. If you enter the ribbon: 00110011, then everything works fine. But if you first enter 1, and then 0, for example 11010, then crashes with the specified error. Here is the code itself:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <assert.h> #define MAXCOMMAND 256 typedef struct _progr { char inputsymb; //ΠΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» int state; //ΠΠ°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ char outputsymb; //Π‘ΠΈΠΌΠ²ΠΎΠ» Π½Π° Π²ΡΡ
ΠΎΠ΄Π΅ int newstate; //ΠΠΎΠ²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ char action; //ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ } progr; /*----------------------------------Π‘ΠΏΠΈΡΠΎΠΊ----------------------------------*/ /*Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠ·Π΅Π»*/ typedef struct _Raw { char value; /*Π₯ΡΠ°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅*/ struct _Raw *next; /*Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ*/ struct _Raw *prev; /*ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ*/ } Raw; typedef struct _DbLink { size_t size; /*Π₯ΡΠ°Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΏΠΈΡΠΊΠ°*/ Raw *head; /*ΠΠ°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ°*/ Raw *tail; /*ΠΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ°*/ } DbLink; /*ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ°*/ DbLink* createDbLink() { DbLink *tmp; tmp = (DbLink*)malloc(sizeof(DbLink)); //ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ tmp->size = 0; //ΠΠ±Π½ΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΏΠΈΡΠΊΠ° tmp->head = tmp->tail = NULL; return tmp; } /*Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ°*/ void deleteDbLink(DbLink *list) { Raw *tmp = list->head; Raw *next = NULL; while (tmp) { next = tmp->next; free(tmp); tmp = next; } free(list); } /*Π€ΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ° (Ρ.ΠΊ. Π΅ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² Π½Π°ΡΠ°Π»ΠΎ, Π²ΡΡ Π»Π΅Π½ΡΠ° Π±ΡΠ΄Π΅Ρ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ*/ void pushBack(DbLink *list, void *value) { Raw *tmp = (Raw*)malloc(sizeof(Raw)); if (tmp == NULL) { exit; } tmp->value = value; tmp->next = NULL; tmp->prev = list->tail; if (list->tail) { list->tail->next = tmp; } list->tail = tmp; if (list->head == NULL) { list->head = tmp; } list->size++; } /*Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ°*/ void printfDbLink(DbLink *list) { Raw *tmp; tmp = list->head; while (tmp != NULL) { printf("%c ", tmp->value); tmp = tmp->next; } printf("\n"); } /*ΠΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π°Π΄ Π»Π΅Π½ΡΠΎΠΉ(Π°Π»ΡΠ°Π²ΠΈΡΠΎΠΌ)*/ void turing(DbLink *list, struct _progr arr[], int cmd) { int error = 0; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π° int headstate = 1; //Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ char replace_symb; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ FILE *result = fopen("result.txt", "wb"); int i = 0; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΡΠ΅ΡΡΠΈΠΊΠ° Raw *buff, *tmp; //ΠΠ²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΡΠ»Π°ΡΡΠΈΠ΅ΡΡ Π½Π° ΡΡΡΡΠΊΡΡΡΡ _Raw tmp = list->head; //ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π° Head Π² ΡΠΏΠΈΡΠΊΠ΅ list fprintf(result, "Result is: "); while (tmp != NULL && error != 1) { for (i = 0; i < cmd; i++) { buff = tmp->value; //ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ - Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ Π² Head ΡΠΏΠΈΡΠΊΠ° list if (buff == arr[i].inputsymb && headstate == arr[i].state) { replace_symb = arr[i].outputsymb; headstate = arr[i].newstate; fprintf(result, "%c", replace_symb); printf("%c ", replace_symb); switch (arr[i].action) { case 'R': { tmp = tmp->next; break;} //ΠΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ R ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ case 'L': { tmp = tmp->prev; break;} //ΠΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ L ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ case 'S': { error = 1; break;} } } } } printf("\n"); } /*---------------------------------main------------------------------------*/ int main(void) { DbLink *list = createDbLink(); //ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΠΈΡΠΊΠ° int headstate = 1, bool = 1, len = 0, c = 0, i = 0, b = 0; long size = 0; char sep[] = ":,"; char line[100]; char *token; char *buf; //ΠΠ°ΡΡΠΈΠ² Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π°Π»ΡΠ°Π²ΠΈΡΠ° ΡΡΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠ· ΡΠ°ΠΉΠ»Π° progr arr[MAXCOMMAND]; //ΠΠ°ΡΡΠΈΠ² ΡΡΡΠΊΡΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΠ’ FILE *fp = fopen("lenta.txt", "r"); //ΠΡΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Π° fseek(fp, 0, SEEK_END); //ΠΡΠΎΡ
ΠΎΠ΄ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° size = ftell(fp); //Π£Π·Π½Π°Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° Π² Π±Π°ΠΉΡΠ°Ρ
buf = (char*)malloc(size * sizeof(char)); //ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΠ΄ ΠΌΠ°ΡΡΠΈΠ² Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π»Π΅Π½ΡΡ rewind(fp); //ΠΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ Π½Π°ΡΠ°Π»Ρ ΡΠ°ΠΉΠ»Π° while (!feof(fp)) { //ΠΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π° fscanf(fp, "%c", &buf[i]); //ΠΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² i++; //ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° } c = i - 1; ///ΠΠ΅Π· ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ Π»ΠΈΡΠ½ΠΈΠΉ ΠΏΡΡΡΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» (????????) for (i = 0; i < c; i++) { pushBack(list, buf[i]); } /*---------------ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΠ’ ΠΈΠ· ΡΠ°ΠΉΠ»Π°!----------------------*/ FILE *prog = fopen("prog.txt", "r"); i = 0; while (fgets(line, 100, prog) != NULL) { if (bool == 1) { len = strlen(line); for (i = 0;i<len;i++) { if (line[i] != '\r' && line[i] != '\n') { } else { bool = 0; break; } } } else { headstate = 1; token = strtok(line, sep); while (token != NULL) { char symb; if (strlen(token) == 1) { symb = *token; } else { if (sscanf(token, "%c%cq%d", &(arr[i].outputsymb), &(arr[i].action), &(arr[i].newstate)) >= 0) { arr[i].inputsymb = symb; arr[i].state = headstate++; printf("%cq%d-%cq%d%c\n", arr[i].inputsymb, arr[i].state, arr[i].outputsymb, arr[i].newstate, arr[i].action); i++; } } token = strtok(NULL, sep); } } } /*------------------ΠΠΊΠΎΠ½ΡΠ°Π½ΠΈΠ΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ!--------------------*/ printfDbLink(list); printf("DBLink length %d\n", list->size); turing(list, arr, i); deleteDbLink(list); system("pause"); } What could be the problem?
Update.
Corrected comparison, now
char temp = tmp->value; temp == arr[i].inputsymbol tmp->value = value (char * value now)
----- Update -----
Fixed a bug, the problem really was in working with memory. I tried to take a value from null. Added another check if (tmp != NULL) So here you are, thanks to everyone for the help!
void turing(DbLink *list, struct _progr arr[], int cmd) { int error = 0; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π° int headstate = 1; //Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ char replace_symb; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ char temp; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· head->value FILE *result = fopen("result.txt", "wb"); int i = 0; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΡΠ΅ΡΡΠΈΠΊΠ° Raw *tmp; //ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΡΠ»Π°ΡΡΠ°ΡΡΡ Π½Π° ΡΡΡΡΠΊΡΡΡΡ _Raw tmp = list->head; //ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π° Head Π² ΡΠΏΠΈΡΠΊΠ΅ list fprintf(result, "Result is: "); while (tmp != NULL && error != 1) { for (i = 0; i < cmd; i++) { if (tmp != NULL) { temp = tmp->value; //ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ - Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ Π² Head ΡΠΏΠΈΡΠΊΠ° list if (temp == arr[i].inputsymb && headstate == arr[i].state) { replace_symb = arr[i].outputsymb; headstate = arr[i].newstate; fprintf(result, "%c", replace_symb); printf("%c ", replace_symb); switch (arr[i].action) { case 'R': { tmp = tmp->next; break;} //ΠΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ R ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ case 'L': { tmp = tmp->prev; break;} //ΠΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ L ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ case 'S': { error = 1; break;} } } } } } printf("\n"); } 