2016-09-26 8 views
1

私の次のステップは、プログラムをメインコードの外のいくつかの関数に分割し、spateファイルとヘッダファイルを使用することです。別ファイルで新しい関数を作成し、ヘッダファイルを使用する

私が移動した最初の機能は、大文字の関数への変更であり、これは素晴らしい動作です。

私は現在、モールス符号から英数字への変換を行うための新しい関数を作成しようとしました。たくさんのエラーが出ているようだ。

メインプログラムの後ろに、関数プログラムのあとにヘッダーファイルを続けて付けました。

MAIN PROGRAM

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

#include "morse.h" 

int main(void) 
{ 

char *morse[] = {"/",".-","-...","-.-.","-..",".","..-.","--  .","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-  .","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----  ","..---","...--","....-",".....","-....","--...","---..","----."}; 
char *alpha[] = {" ", "A", "B",  
    "C", "D", "E","F", "G", "H", "I", "J", "K", "L", "M", "N",   "O", "P", "Q", "R", "S", "T","U", "V", "W", "X", "Y", "Z"  , "0", "1", "2", "3", "4", "5", "6", "7", "8",   "9"}; 


    char *print_array[50]; 
    int print_array_index = 0; 

    char hold[50]; 
    int hold_index = 0; 

    char input[200]; 
    int i = 0; 

//Requesting input from the user 
printf("Welcome to the Morse translator.\n"); 
    printf("Enter input: "); 
    fgets(input, sizeof(input), stdin); 

// Call to a function that converts user input to UPPERCASE 
turnUpCase(input); 

    if (input[0]=='-' || input[0]=='.') 
    { 
    //Calls the function to convert Morse code to Alpha 
    morseToAlpha(input, *alpha, *morse); 
} 
    // this section is now in a seperate function 
/*  while (input[i] !='\0') { 

     if (input[i] ==' ' || input[i] == '\n') 
     { 
      hold[hold_index] = '\0'; 

      bool found = false; 

      for (int x = 0; x < sizeof(morse)/sizeof(char *); x++) 
      { 
       if (strcmp(morse[x], hold) == 0) 
       { 
        print_array[print_array_index++] = alpha[x]; 

        found = true; 

        break; 
       } 
      } 

      if (!found) 
      { 
       fprintf(stderr, "Invalid Morse code!"); 
       return 0; 
      } 

      hold_index = 0; 
     } 
     else 
     { 
      hold[hold_index++] = input[i]; 
     } 

     i++; 
    } 
    for (int x = 0; print_array_index > x; x++) 
    //for (int x = 0; x < print_array_index; x++) 
    { 
     printf("%s", print_array[x]); 

    } 

    printf("\n"); 
} 

*/ 

else if (isalnum(input[0])) 
{ 
    while (input[i]!='\0' && input[i] !='\n') 
    { 
     bool found = false; 

     for (int x=0; x < sizeof(alpha)/sizeof(char*);x++) 
     { 
      if (*alpha[x]==input[i]) 
      { 
       print_array[print_array_index++] = 
    morse [x]; 


       found = true; 
       break; 
      } 
     } 
     if (!found) 
     { 
      fprintf(stderr, "Invalid input!\n"); 
      return 0; 
     } 
     i++; 

    } 
    printf("%s",print_array[0]); 
    for (int x=1; x < print_array_index; x++) 
    { 
     printf(" %s",print_array[x]); 
    } 
    printf("\n"); 
}   
    return 0; 
} 

エラー

#include<stdlib.h> 
#include<stdio.h> 
#include<stdbool.h> 
#include<string.h> 
#include"morse.h" 


void morseToAlpha(char *in, char *letters, char *code) 
{ 
int i=0; 
int x=0; 

char *print_array[50]; 
int print_array_index =0; 

char hold[50]; 
int hold_index = 0; 



while (in[i] !='\0') 
{ 

     if (in[i] ==' ' || in[i] == '\n') 
     { 
      hold[hold_index] = '\0'; 

      bool found = false; 

      for (int x = 0; x < sizeof(code)/sizeof(char *); x++) 
      { 
       if (strcmp(*code[x], hold) == 0) 
       { 
        print_array[print_array_index++] = letters[x]; 

        found = true; 

        break; 
       } 
      } 

      if (!found) 
      { 
       fprintf(stderr, "Invalid Morse code!"); 
       return 0; 
      } 

      hold_index = 0; 
     } 
     else 
     { 
      hold[hold_index++] = in[i]; 
     } 

     i++; 
    } 
    for (int x = 0; print_array_index > x; x++) 
    //for (int x = 0; x < print_array_index; x++) 
    { 
     printf("%s", print_array[x]); 

    } 

    printf("+++++\n"); 
} 

現在はエラー

morseToAlpha.cコンパイルの原因となっているんMy機能:機能 'においてmorseToAlpha': morseToAlpha.c:32 :29:エラー:unary '*'の無効な型引数( 'int'を持つ)

IF(のstrcmp(*コード[x]は、保持)== 0) ^ morseToAlpha.c:34:55:警告:割り当てキャストなし整数からポインタを行う[-Wint変換] print_array [print_array_index ++] =文字[x]; ^ morseToAlpha.c:45:13:警告:返り値を返す関数でvoidを返す return 0; ^

+3

はあなたが取得しているエラーを追加:としてこのように、あなたの関数を宣言する必要があります。 –

+0

'morseToAlpha()'を定義して、 'char *'を第2引数と第3引数としていましたが、 'char **'を渡しました。このミスは、ソースコードをいくつファイルに配布するかとは完全に独立しています。 – alk

+0

2つの配列が不正なデータ構造(チェックするのは難しい)、sctruct {char letter; char * morse; } 良くなります –

答えて

0

あなたの問題が何であるかはわかりませんが、これは私の考えです。

あなたの作品を別のファイルに分割して、別のファイルfunction prototypeをヘッダファイルに入れてください。

プロジェクトが小さい場合は、すべて同じディレクトリに置くことができます。プロジェクトが大きければ、複数のディレクトリで分割してメイクファイルを使用してプロジェクトをコンパイルするとよいでしょう。

srcs/file1.c 
srcs/fileX.c 
incs/header.h 
Makefile 

質問のタイトルは次のとおりです。は、その場合にはそう

別々のファイルに新しい関数を作成し、ヘッダファイルを使用しました。私たちは、

morse.hヘッダファイルにアルファプロトタイプに main.cファイルとmorseToAlpha morse.c INとモールスであなたの主なfonctionを入れて、で、プロジェクトをコンパイルします:

gcc -Wall -Wextra -Werror main.c morse.c morse.h 

しかし、あなたは上で見てみる必要がありますhow to build a Makefile

1

あなたがここに作成している:

char *morse[]....; 
char *alpha[]....; 

です配列へのポインタではありません。

(char *)(morse[])..; 
(char *)(alpha[])..; 

*morseが、その後charへのポインタである、として読み込まれます。機能strcmp(*code[x], hold)

codecharへのポインタです。

code[x]は、charです。

しかし、あなたは*code[x]を実行しています。

同じエラーを生成する例であり、

int main() { 
    char c = 'h'; 
    printf("%c\n", *c); 
} 
0

コード:

char *morse[] = {"/", ...}; 
char *alpha[] = {" ", ...}; 

は、最初の文字へのポインタのアレイであることがmorsealphaを宣言し、その後これらの配列を初期化します。さて、"/"のような文字列リテラルは、実際には文字の配列です:"/" = {'/', '\0'}。したがって、charへのポインタでいっぱいにされる配列morseは、charへのポインタ(つまり、文字リテラル'/'へのポインタ)を最初の要素として含むように初期化されます。

関数を使用して配列を処理する場合は、配列の名前で関数を呼び出し、配列の最初の要素へのポインタが関数に渡されます。だからあなたの関数呼び出しは次のようになります。

morseToAlpha(input, alpha, morse); 

これは、入力へのポインタを渡す[0]、charへのポインタである、アルファへのポインタ[0]、charへのポインタへのポインタです(すなわち、文字列へのポインタ)と、charへのポインタへのポインタであるmorse [0]へのポインタ。私はこれが役に立てば幸い

void morseToAlpha(char *in, char **letters, char **code); 

:)

関連する問題