エラー詳細

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
チタン合金

エラー詳細

#1

投稿記事 by チタン合金 » 3年前

コード:

#include<iostream>

int main(void) {
    using namespace std;

    char c;
    int cnt[10] = { 0 };          //配列cntの全要素を0で初期化

    while (cin.get(c)) {
        if (c >= '0' && c <= '9')
            cnt[c - '0']++;
    }
    for (int i = 0; i < 10; i++)
        cout << i << "の出現回数:" << cnt[i] << '\n';

    getchar();
    cin.ignore();
    return(0);
}
すみませんが、これどこが間違っていてエラーが出るのかわかりません。
どうかご教示お願いいたします。

エラー一覧
定義されてない識別子です。
この文字を識別子で使用することは、できません。
この文字を識別子の最初の文字にすることはできません。
;がwhileの前にありません(これはあると思うのですが)

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: エラー詳細

#2

投稿記事 by みけCAT » 3年前

Wandboxで試した所、C++03ではエラーが出ましたが、C++11ではエラーが出ませんでした。
とりあえず、最後の無駄な

コード:

    getchar();
    cin.ignore();
を消すといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

チタン合金

Re: エラー詳細

#3

投稿記事 by チタン合金 » 3年前

すみません、解りました、
ヘッダ#include <cmath>が抜けていました。

後、このプログラムの動作に関して、ご教示頂きたいです。
よろしくお願いします。
配列の計算してるのですが、配列のこのような使い方が初めてでして。

チタン合金

Re: エラー詳細

#4

投稿記事 by チタン合金 » 3年前

回答ありがとうございます、
 
この二つがないと、エラーが出ますよ。

コード:

getchar();
cin.ignore();
 

getcharは、よく解らないですが、
cin.ignoreは、ビルドでCtrl+zを押す際に終了してしまうとかだと思います。
cinを使っているので。

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: エラー詳細

#5

投稿記事 by プラム » 3年前

チタン合金 さんが書きました: この二つがないと、エラーが出ますよ。

コード:

getchar();
cin.ignore();
 

getcharは、よく解らないですが、
cin.ignoreは、ビルドでCtrl+zを押す際に終了してしまうとかだと思います。
cinを使っているので。
どうしてよくわかっていないのにその関数を実行しているんですか?

プログラムがどういう処理を行っているかわかる範囲でコードを書いたほうが良いと思います。

チタン合金

Re: エラー詳細

#6

投稿記事 by チタン合金 » 3年前

あ、エラーは出ないようですね^^;間違えました;

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: エラー詳細

#7

投稿記事 by プラム » 3年前

それと、ここのサイトで、一番最初に提示したコードをC++15でコンパイルした結果、
何のエラーも出ず無事コンパイルできました。
チタンさんのコンパイラのバージョンや、古いコンパイラを使っているのが原因かもしれません、できれば更新してみたほうが良いと思います。

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: エラー詳細

#8

投稿記事 by プラム » 3年前

チタン合金 さんが書きました: 後、このプログラムの動作に関して、ご教示頂きたいです。
よろしくお願いします。
配列の計算してるのですが、配列のこのような使い方が初めてでして。
配列の計算をするプログラムとしてはすごく良いと思います。
それと、本題が解決したのであれば解決を押してくれるとありがたいです。

Rittai_3D
記事: 524
登録日時: 7年前

Re: エラー詳細

#9

投稿記事 by Rittai_3D » 3年前

ノウル さんが書きました:それと、ここのサイトで、一番最初に提示したコードをC++15でコンパイルした結果、
何のエラーも出ず無事コンパイルできました。
チタンさんのコンパイラのバージョンや、古いコンパイラを使っているのが原因かもしれません、できれば更新してみたほうが良いと思います。
オフトピック
C++15って何でしょう。C++14のことなのか、MSVS 2015 のことを言っているのか。
初心者です

チタン合金

Re: エラー詳細

#10

投稿記事 by チタン合金 » 3年前

>>ノウルさん
えーーー;本当ですか;
コンパイラ古いのか;

あと、配列解っているわけではないのですよ><;
while(cin.get(c)){ここで文字を取り込むのは解るのですが、
if(c >= '0' && C <= '9')のここは、'0'の部分は、文字定数ですよね?
文字定数って条件式に使えるものなんですね。
あと配列のcnt[c - '0']++; これは何をしているのでしょうか?
配列の中でなんか計算してるみたいですが、
本当にプログラムは、とりあえずサンプル打ち込んでそれから意味を解釈するという順序でやってます。
どうかご教示お願いします。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: エラー詳細

#11

投稿記事 by みけCAT » 3年前

チタン合金 さんが書きました:if(c >= '0' && C <= '9')のここは、'0'の部分は、文字定数ですよね?
文字定数って条件式に使えるものなんですね。
文字定数(N3337 2.14.3 Character literals)はliteralの一種であり、literalはprimary expression(N3337 5.1)なので、式に使えます。
条件式は式の一種なので、当然使えます。
チタン合金 さんが書きました:あと配列のcnt[c - '0']++; これは何をしているのでしょうか?
cに代入された数字の文字コードを対応する数値に変換し、配列のその数値を添え字とする要素に1を足しています。
C++の規格で数字の文字コードは直感的な順番で連続しているとされているので、この式で数字を数値に変換できます。
N3337 2.3 Character sets さんが書きました: 1 The basic source character set consists of 96 characters: the space character, the control characters repre-
senting horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters:

[table=margin-left:2em;][tr=][td=font-family:monospace;]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[/td][/tr]
[tr=][td=font-family:monospace;]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[/td][/tr]
[tr=][td=font-family:monospace;]0 1 2 3 4 5 6 7 8 9[/td][/tr]
[tr=][td=font-family:monospace;]_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ∼ ! = , \ " ’[/td][/tr][/table]
(中略)

3 (中略) In both the source and execution basic character sets, the value of each character after 0 in the
above list of decimal digits shall be one greater than the value of the previous.
今回のオペランドはint型なので、後置++演算子はオペランドの値をそれに1を足したものに書き換えます。
N3337 5.2.6 Increment and decrement さんが書きました: The value of the operand object is modified by
adding 1 to it, unless the object is of type bool, in which case it is set to true.
N3337
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

チタン合金

Re: エラー詳細

#12

投稿記事 by チタン合金 » 3年前

解りました。
回答ありがとうございます。

かずま

Re: エラー詳細

#13

投稿記事 by かずま » 3年前

チタン合金 さんが書きました: すみませんが、これどこが間違っていてエラーが出るのかわかりません。
それは、あなたが、エラーメッセージを見ていないからです。
チタン合金 さんが書きました: エラー一覧
定義されてない識別子です。
この文字を識別子で使用することは、できません。
この文字を識別子の最初の文字にすることはできません。
;がwhileの前にありません(これはあると思うのですが)
エラーメッセージは、どの識別子が定義されているのかを教えてくれます。
「この文字」がなんであるかを示しているはずです。
なぜ、エラーメッセージをそのまま貼り付けないのですか?

また、あなたが張り付けたソースプログラムでは、そのようなエラーは出ないはずです。

そこで、同じようなエラーが出るようにソースを改変してみました。

コード:

#include<iostream>

int main(void) {
    using namespace std;

    char c;
    int cnt[10] = { 0 };           //配列cntの全要素を0で初期化

    while (cin.get(c)) {
        if (c >= '0' && c <= '9')
            cnt[c - '0']++;
    }
    for (int i = 0; i < 10; i++)
        cout << i << "の出現回数:" << cnt[i] << '\n';

    getchar();
    cin.ignore();
    return(0);
}

コード:

C:\tmp>cl -EHsc a.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.31101 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

a.cpp
a.cpp(7) : error C3872: '0x3000': この文字を識別子で使用することはできません
a.cpp(9) : error C2065: ' ' : 定義されていない識別子です。
a.cpp(9) : error C2143: 構文エラー : ';' が 'while' の前にありません。
どこが間違っているのかを説明できないと、解決したとは言えないと思います。

かずま

Re: エラー詳細

#14

投稿記事 by かずま » 3年前

追加と訂正です。
かずま さんが書きました:
チタン合金 さんが書きました: すみませんが、これどこが間違っていてエラーが出るのかわかりません。
それは、あなたが、エラーメッセージを見ていないからです。
エラーメッセージは、ソースのどの行でエラーを見つけたのかを教えてくれます。
かずま さんが書きました:
チタン合金 さんが書きました: エラー一覧
定義されてない識別子です。
エラーメッセージは、どの識別子が定義されているのかを教えてくれます。
どの識別子が定義されていないのかを教えてくれます。

チタン合金

Re: エラー詳細

#15

投稿記事 by チタン合金 » 3年前

すみませんが、この質問は、すでに解決しています。
すみません;

チタン合金

Re: エラー詳細

#16

投稿記事 by チタン合金 » 3年前

エラーメッセージは、コピーで貼り付けられないと思ってました;
回答者の皆さんを惑わせて解りずらい質問文を書いてしまい申し訳ありませんでした。

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: エラー詳細

#17

投稿記事 by プラム » 3年前

Rittai_3D さんが書きました:
ノウル さんが書きました:それと、ここのサイトで、一番最初に提示したコードをC++15でコンパイルした結果、
何のエラーも出ず無事コンパイルできました。
チタンさんのコンパイラのバージョンや、古いコンパイラを使っているのが原因かもしれません、できれば更新してみたほうが良いと思います。
オフトピック
C++15って何でしょう。C++14のことなのか、MSVS 2015 のことを言っているのか。
すみません、僕の間違いです、「C++15」ではなく「C++14」の間違いでした。

閉鎖

“C言語何でも質問掲示板” へ戻る