質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

プログラムの移植性について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 356

RaitoN

score 60

PC上で書いたプログラムをスマートフォン上でコンパイル,実行したい

もともとPC上で動かしていたプログラムをそのままiPhoneに移植できたら大変便利なので,AppStoreなどで無料で入手できるCのコンパイラをダウンロードしコンパイル,実行したところうまく動かない部分があります.
PCはOS X El Capitan ver. 10.11.6でgccコンパイラを使っています.
うまくいかないのは,コンパイラのせいでしょうか?それとも他に原因がありますか?
いままでこのようなことをしたことがなかったので,つまずいています.

エラー中身について

アプリ名:CppCode
入力が2回求められて結果が表示されない

アプリ名:モバイルC
数字が入ったものを入力すると
mol.c(174):error: __builtin_huge_val:No symbol found.
数字がないものだと問題なく動作.

アプリ名:C Language
コンパイルが通らない
Insufficient compilations. Please get more on Setting tab.

アプリ名:SketchCFree
math.hが無い

解決したいこと,知りたいこと

自分のPCでは動くが,よそでは動かないということはよくあること?

char samplename[64] = {};
という宣言の仕方で自分のPC上では問題なく動作するのはなぜでしょう?

このソースコードをWindowsで動かしたらちゃんと動くのか,気になります.

化学式を入力し,その分子量を求める自作のプログラム

(例)
入力: Fe
出力: 55.84500 g/mol

入力: O2
出力: 31.99880 g/mol

入力: H2O
出力: 18.01536 g/mol

入力: (Fe0.9Mn0.1)3GeTe2
出力: 495.09290 g/mol

入力: YBa2Cu3O6.8
出力: 662.99372 g/mol

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

char samplename[64] = {};
int isDigit(char);
typedef struct Material {
    int type; //0=Atom, 1=Molecule
} Material_t;
typedef struct Atom {
    int material_type; //0=Atom, 1=Molecule
    char name[3];
    double weight;
} Atom_t;
typedef struct MaterialValue {
    Material_t *material; //Atom or Molecule
    double ratio;
} MaterialValue_t;
typedef struct Molecule {
    int material_type; //0=Atom, 1=Molecule
    int materials_count;
    MaterialValue_t materials[64];
} Molecule_t;
Atom_t atoms[] = {
    { 0, "H" , 1.00798 }, { 0, "He", 4.0026  }, { 0, "Li", 6.968   },
    { 0, "Be", 9.01218 }, { 0, "B" , 10.814  }, { 0, "C" , 12.0106 },
    { 0, "N" , 14.0069 }, { 0, "O" , 15.9994 }, { 0, "F" , 18.9984 },
    { 0, "Ne", 20.1797 }, { 0, "Na", 22.9898 }, { 0, "Mg", 24.306  },
    { 0, "Al", 26.9815 }, { 0, "Si", 28.085  }, { 0, "P" , 30.9738 },
    { 0, "S" , 32.068  }, { 0, "Cl", 35.452  }, { 0, "Ar", 39.948  },
    { 0, "K" , 39.0983 }, { 0, "Ca", 40.078  }, { 0, "Sc", 44.9559 },
    { 0, "Ti", 47.867  }, { 0, "V" , 50.9415 }, { 0, "Cr", 51.9961 },
    { 0, "Mn", 54.938  }, { 0, "Fe", 55.845  }, { 0, "Co", 58.9332 },
    { 0, "Ni", 58.6934 }, { 0, "Cu", 63.546  }, { 0, "Zn", 65.38   },
    { 0, "Ga", 69.723  }, { 0, "Ge", 72.630  }, { 0, "As", 74.9216 },
    { 0, "Se", 78.971  }, { 0, "Br", 79.904  }, { 0, "Kr", 83.798  },
    { 0, "Rb", 85.4678 }, { 0, "Sr", 87.62   }, { 0, "Y" , 88.9058 },
    { 0, "Zr", 91.224  }, { 0, "Nb", 92.9064 }, { 0, "Mo", 95.95   },
    { 0, "Tc", 99      }, { 0, "Ru", 101.07  }, { 0, "Rh", 102.906 },
    { 0, "Pd", 106.42  }, { 0, "Ag", 107.868 }, { 0, "Cd", 112.414 },
    { 0, "In", 114.818 }, { 0, "Sn", 118.710 }, { 0, "Sb", 121.760 },
    { 0, "Te", 127.60  }, { 0, "I" , 126.904 }, { 0, "Xe", 131.293 },
    { 0, "Cs", 132.905 }, { 0, "Ba", 137.327 }, { 0, "La", 138.905 },
    { 0, "Ce", 140.116 }, { 0, "Pr", 140.908 }, { 0, "Nd", 144.242 },
    { 0, "Pm", 145     }, { 0, "Sm", 150.36  }, { 0, "Eu", 151.964 },
    { 0, "Gd", 157.25  }, { 0, "Tb", 158.925 }, { 0, "Dy", 162.500 },
    { 0, "Ho", 164.930 }, { 0, "Er", 167.259 }, { 0, "Tm", 168.934 },
    { 0, "Yb", 173.045 }, { 0, "Lu", 174.967 }, { 0, "Hf", 178.49  },
    { 0, "Ta", 180.948 }, { 0, "W" , 183.84  }, { 0, "Re", 186.207 },
    { 0, "Os", 190.23  }, { 0, "Ir", 192.217 }, { 0, "Pt", 195.084 },
    { 0, "Au", 196.967 }, { 0, "Hg", 200.592 }, { 0, "Tl", 204.384 },
    { 0, "Pb", 207.2   }, { 0, "Bi", 208.980 }, { 0, "Po", 210     },
    { 0, "At", 210     }, { 0, "Rn", 222     }, { 0, "Fr", 223     },
    { 0, "Ra", 226     }, { 0, "Ac", 227     }, { 0, "Th", 232.038 },
    { 0, "Pa", 231.036 }, { 0, "U" , 238.029 }, { 0, "Np", 237     },
    { 0, "Pu", 239     }, { 0, "Am", 243     }, { 0, "Cm", 247     },
    { 0, "Bk", 247     }, { 0, "Cf", 252     }, { 0, "Es", 252     },
    { 0, "Fm", 257     }, { 0, "Md", 258     }, { 0, "No", 259     },
    { 0, "Lr", 262     }, { 0, "Rf", 267     }, { 0, "Db", 268     },
    { 0, "Sg", 271     }, { 0, "Bh", 272     }, { 0, "Hs", 277     },
    { 0, "Mt", 276     }, { 0, "Ds", 281     }, { 0, "Rg", 280     },
    { 0, "Cn", 285     }, { 0, "Nh", 278     }, { 0, "Fl", 289     },
    { 0, "Mc", 289     }, { 0, "Lv", 293     }, { 0, "Ts", 293     },
    { 0, "Og", 294     }, {-1, ""  ,  -1     } //EOD
};
int str_cnt(char str[], char c) {
    int n = 0;
    for (int i=0; i<(int)strlen(str); i++) {
        if (str[i] == c) n++;
    }
    return n;
}
void JudgeBrackets(void) {
    char *bra, *ket;
    bra = strchr(samplename, '(');
    ket = strchr(samplename, ')');

    if (bra == NULL && ket == NULL) return;
    if (str_cnt(samplename, '(') != str_cnt(samplename, ')')) {
        fprintf(stderr, "The numbers of '(' and ')' do not match.\n");
    } else if (++bra == ket) {
        fprintf(stderr, "Nothing is entered in parenthese.\n");
    } else if (isDigit(samplename[bra - samplename])) {
        fprintf(stderr, "Incorrect input.\n");
    } else return;
    exit(1);
}
void Input(void){
    printf("Enter sample name.\nChemical formula =>  ");
    if (scanf("%63[^\n]%*[^\n]", samplename) != 1) {
        fprintf(stderr, "%s\n", strerror(errno));
        exit(1);
    }
    if (isDigit(samplename[0])) {
        fprintf(stderr, "Incorrect input.\n");
        exit(1);
    } else while (getchar() != '\n');
    return JudgeBrackets();
}
Atom_t *search_atom(char *name) {
    Atom_t *p;
    for (p=atoms; p->weight>0; p++) {
        if (strcmp(p->name, name) == 0) return p;
    }
    fprintf(stderr, "The entered atom or molecule does not exist!\n");
    exit(1);
}
Molecule_t *newMolecule() {
    Molecule_t *molecule = (Molecule_t *)malloc(sizeof(Molecule_t));
    molecule->material_type = 1;
    molecule->materials_count = 0;
    return molecule;
}
void add(Molecule_t *molecule, Material_t *material) {
    MaterialValue_t *mv = &(molecule->materials[molecule->materials_count++]);
    mv->material = material;
    mv->ratio = 1.0;
}
void setRatio(Molecule_t *molecule, double ratio) {
    molecule->materials[molecule->materials_count-1].ratio = ratio;
}
double getWeight(Molecule_t *molecule) {
    double weight = 0;
    for (int i=0; i<molecule->materials_count; i++) {
        MaterialValue_t *mv = &molecule->materials[i];
        if (mv->material->type == 0) { //Atom
            weight += ((Atom_t *)(mv->material))->weight * mv->ratio;
        } else { //Molecule
            weight += getWeight((Molecule_t *)(mv->material)) * mv->ratio;
        }
    }
    return weight;
}
//  Stack
Molecule_t *stack[64];
int stack_pointer = 0;
void stack_push(Molecule_t *molecule) {
    stack[stack_pointer++] = molecule;
}
Molecule_t *stack_pop() {
    return stack[--stack_pointer];
}
Molecule_t *stack_peek() {
    return stack[stack_pointer-1];
}
//  Analysis
int isDigit(char c) {
    return ('0' <= c && c <= '9');
}
int isDigitOrPeriod(char c) {
    return (isDigit(c) || c == '.');
}
Molecule_t *parse(void) {
    int i, j, k;
    char v[64];
    stack_push(newMolecule());
    for (i=0; i<(int)strlen(samplename); i++) {
        memset(v, '\0', sizeof(v));
        v[0] = samplename[i];
        if (isDigit(v[0])) {
            for (j=i+1, k=1; j<(int)strlen(samplename) && isDigitOrPeriod(samplename[j]); k++, j++, i++) {
                v[k] = samplename[j];
            }
            if (strtod(v, NULL) == HUGE_VAL) {
                fprintf(stderr, "OverFlow.\n");
                exit(1);
            } else if (strtod(v, NULL) == 0 && errno == ERANGE) {
                fprintf(stderr, "UnderFlow.\n");
                exit(1);
            } else setRatio(stack_peek(), strtod(v, NULL));
        } else if (strcmp(v, "(") == 0) {
            stack_push(newMolecule());
        } else if (strcmp(v, ")") == 0) {
            Material_t *material = (Material_t *)stack_pop();
            add(stack_peek(), material);
        } else {
            //  Determine whether the next character is lowercase.
            //  If it is lowercase, it's a two letter atom, otherwise it's a one letter atom.
            if ((samplename[i+1]>='a') && (samplename[i+1]<='z')) {
                v[1] = samplename[i+1];
                i++;
            }
            add(stack_peek(), (Material_t *)search_atom(v));
        }
    }
    return stack_pop();
}
int main(void) {
    Input();
    printf("%.5lf g/mol\n", getWeight(parse()));
    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yumetodo

    2019/05/25 22:10

    いや、だから具体的なエラーなり想定外の挙動の中身を書いてください。話はそれから。

    キャンセル

  • episteme

    2019/05/25 22:19

    「具合が悪い」の一言で薬をくれる医者はいませんぜ。診てほしけりゃシャツめくらんと。

    キャンセル

  • RaitoN

    2019/05/25 22:30

    質問が悪くてすみません.具体的に,追記しました.

    キャンセル

回答 2

checkベストアンサー

+1

とりあえず手元のgccは

prog.c:7:23: warning: ISO C forbids empty initializer braces [-Wpedantic]
    7 | char samplename[64] = {};
      |                       ^
prog.c: In function 'Input':
prog.c:100:12: warning: ISO C forbids 'return' with expression, in function returning void [-Wpedantic]
  100 |     return JudgeBrackets();
      |            ^~~~~~~~~~~~~~~
prog.c:90:6: note: declared here
   90 | void Input(void){
      |      ^~~~~

と申しておりますね。

これ以上は

実行したところうまく動かない部分があります.

の具体的な中身を追記してください。


? アプリ名:モバイルC

数字が入ったものを入力すると
mol.c(174):error: __builtin_huge_val:No symbol found.
数字がないものだと問題なく動作.

-lmをオプションにつけてみてください。 いや、手元で試したけど再現しないぞ・・・?(CPP1.2.10/clang6.0.0どちらも)

アプリ名:C Language
コンパイルが通らない
Insufficient compilations. Please get more on Setting tab.

エラーメッセージの通り設定タブを見に行ってください。なんか追加の情報があるんじゃないですかねぇ。

アプリ名:SketchCFree
math.hが無い 

SketchCFreeというのが見つかりません、なにか勘違いしていないですか?

>char samplename[64] = {};
>という宣言の仕方で自分のPC上では問題なく動作するのはなぜでしょう? 

gcc拡張のおかげではないかと。手元では-pedanticをつけてコンパイルしているのでgcc拡張を無効にしています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 22:08

    回答ありがとうございます.
    もともと自分のPCでしか試したことがなかったもので,助かります.
    例えば
    char samplename[64] = {};
    という宣言は正しい書き方だと思い込んでたのですが処理系に依存するのでしょうかね...

    キャンセル

  • 2019/05/25 22:10

    C++では正しいですが、C言語では{ 0 }ですね、この0を省略できません。
    https://cpplover.blogspot.com/2010/09/aggregate.html

    キャンセル

  • 2019/05/25 22:20

    ありがとうございます.スッキリしました.
    リファレンスもありがとうございます.

    キャンセル

  • 2019/05/25 23:36 編集

    ところでCppCode、アルファベットがまずもって入力できないのなんでだ?一体どうやって使えば良いんだ、このアプリ・・・。というわけで文字を打つ方法が判明しない限りこのアプリのことは知らん。コンパイル以前の問題だわ。

    キャンセル

+1

これまで使ってきたgccとAppStoreで入手したCのコンパイラに(あなたのプログラムが動作するのに必要な)互換性があるのでしょうか?
Cコンパイラと一括りにせず、仕様の詳細を確認してください。
さらにコンパイラや実行時ライブラリはある程度OSに依存しています。
そのため、同じソースで管理されているコンパイラでも動作環境により動作が異なる場合があります。
ある環境で動作していたアプリを他の環境に持っていき、コンパイルだけで動作するのはラッキーです。
みな移植で苦労しています。
例えばMS Officeのexcelは一時、Mac版がありましたが、現在はサポートしていないはずです。
他環境への移植は大手のソフトウェアベンダでもたいへんなのです。

うまくいかないという表現で全てを理解しろというのは無理です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 22:19

    >例えばMS Officeのexcelは一時、Mac版がありましたが、現在はサポートしていないはずです。

    もともとMac上のほうが先だし今もありますが・・・

    キャンセル

  • 2019/05/25 22:33

    他の環境に移すのは大変なんですね.回答ありがとうございます.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る