ページ 1 / 1
コマンドプロンプト
Posted: 2009年11月29日(日) 08:39
by 天和
前回同じタイトルで質問をしたものですが・・・・
(コマンドプロンプトをつかって
-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
""の間の言葉を
-nの分だけ繰り返すプログラムを作りなさい
上記の場合はhello hello helloと出てきたら成功です
とのことですがさっぱりわかりませんそもそも""のあいだ文章だけをいう認識をどうやってプログラムすればいいか・・・
一応ヒントでは
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
}
とのことですが・・・)
前回高木さんの回答を下にやろうとしていたのですが
自分の使っているVISUAL C++では
#include <stdlib.h>
が使えないためまたgetoptも使おうとしたのですが
同じく使えないためサイド質問させていただきました
ヒントの↓は
#include<stdio.h>
int main(int argc char **argv
{
while(argc--)printf("%s\n", *argv++);
return 0;
}
コンパイルで実行するとプログラムを書いたアプリケーションファイルの場所のアドレスが出てきますが
コマンドプロンプトで実行するとプログラムを書いたファイル名が出てきます(ファイル名はtest.exeです)
そして例えばコマンドプロンプトで (アプリケーションのあるアドレス)> test.exe asと打つと(半角スペースあけておかなければならない)
test.exe
as
と表示されます。いったいポインタ以外に何を使うんでしょうか?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 09:30
by 朽木
前スレ見てないので何の話かは分からないんですが
一文字目が '-' で二文字目が 's' か 'n' かどうかを調べれば話が早いのでは?
あと、""のあいだって、"の次の文字から"がくるまでですよね
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 09:47
by 天和
>朽木さん
前すれは
http://www.play21.jp/board/formz.cgi?ac ... &rln=42723
です
>あと、""のあいだって、"の次の文字から"がくるまでですよね
はいそのとおりです
調べるのはgetcharとかつかえばいいんでしょうがそのごその回数分コピーしなければならないので
それが困っています。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 10:03
by non
タカギさんのプログラムが動かないのですか?
>#include <stdlib.h>が使えないため
そんなことはないのでは?
VisualC++2008ですよね。
stdbool.hでエラーが出るのならわかるのですが。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 10:15
by 天和
失礼しました
使えないのは
unistd.h(getoptにつかう)
とstdbool.hでしたすいません
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 10:24
by たかぎ
> 自分の使っているVISUAL C++では
そんな情報は今回始めて出ました。
情報を後だしするのではなく、最初から規約を守って必要な情報を提示するようにしましょう。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 10:30
by non
stdbool.hをコメントアウトして試してみてください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 11:06
by 天和
>高木さん
すいませんまさかコンパイラによって使えないヘッダーがあるとは思わなかったものですから。
>nonさん
コメントアウトしたところ実行はするのですがすぐに終わってしまいます(もしかしたらコメントアウト
を勘違いしてるかもしれませんのでソースを載せて起きます)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
/*#include <stdbool.h>*/
bool str_to_ui(const char *s, unsigned int *pi)
{
while (isspace((unsigned char)*s))
++s;
if (!isdigit((unsigned char)*s))
return false;
char *endptr;
errno = 0;
unsigned long t = strtoul(s, &endptr, 10);
if (errno != 0 || t > UINT_MAX || *endptr != '\0')
return false;
*pi = (unsigned int)t;
return true;
}
int main(int argc, char *argv[/url])
{
unsigned int n = 0;
const char *s = "";
for (int i = 1; i < argc; i++)
{
const char *arg = argv;
if (arg[0] == '-')
{
switch (arg[1])
{
case 'n':
if (arg[2] != '\0')
{
if (!str_to_ui(&arg[2], &n))
return EXIT_FAILURE;
}
else if (++i >= argc || !str_to_ui(argv, &n))
{
return EXIT_FAILURE;
}
break;
case 's':
if (arg[2] != '\0')
{
s = &arg[2];
}
else if (++i >= argc)
{
return EXIT_FAILURE;
}
else
{
s = argv;
}
break;
default:
return EXIT_FAILURE;
}
}
else
{
return EXIT_FAILURE;
}
}
for (int i = 0; i < n; i++)
{
fputs(s, stdout);
fputc(i < n - 1 ? ' ' : '\n', stdout);
}
return EXIT_SUCCESS;
}
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 12:54
by softya
たかぎさんのコードはC99準拠で書かれていますので、あくまで参考に留め自力でご存知のC言語の文法の範囲で書き直してください。よい勉強になると思います。
stdbool.hもC99のヘッダなため、C99に対応していないVisualC++では存在しません。
VisualC++で書き直す必要のあるもの
・bool boolは定義されていない。intで代用。
・true 真は0で無ければ良い。1で代用。
・false 偽は0であれば良い。0で代用。
・for (int i = 1; i < argc; i++) for文中でint宣言できない。外に出す。
・for (int i = 0; i < n; i++) 同上
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 12:57
by non
実行のやり方は?
まさかとは思うけど、パラメータを与えてないということはないですよね。
>(コマンドプロンプトをつかって
>-n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 13:02
by softya
[追記]
ちなみに、stdbool.hをコメントアウトしてC++コンパイラでコンパイルするとC99基準で書かれているコードでもコンパイルが通ってしまいます。エラーが出なかったならC++でコンパイルしている事になりますね。
C99準拠の文法である事を天和さんが自覚しているなら問題ないです。
ちなみに何もおきないのは、パラメータをちゃんと入力していないのでは?
私のところでは、たかぎさんのプログラムはちゃんと動きました。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 13:08
by たかぎ
> ちなみに、stdbool.hをコメントアウトしてC++コンパイラでコンパイルするとC99基準で書かれているコードでもコンパイルが通ってしまいます。エラーが出なかったならC++でコンパイルしている事になりますね。
> C99準拠の文法である事を天和さんが自覚しているなら問題ないです。
CとC++の区別がついていない人は多いですからね。
そうした現状を踏まえて、↓のような記事を書いていたりもするわけですが...
http://www.kijineko.co.jp/tech/cpp2c
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 13:24
by softya
天和さんの書いている事を見て不思議に思うことがありました。
>調べるのはgetcharとかつかえばいいんでしょうがそのごその回数分コピーしなければならないので
>それが困っています。
getcharはstdinからの入力で使うもので、今回の起動パラメータ入力では使えません。
もしかして、stdinから入力できると思っていませんか?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 13:34
by たかぎ
> getcharはstdinからの入力で使うもので、今回の起動パラメータ入力では使えません。
> もしかして、stdinから入力できると思っていませんか?
またしても後だし条件で...
#include <stdio.h>
int main(int argc, char *argv[/url])
{
if (argc > 1)
{
FILE *stream = popen(argv[0], "w");
int i;
for (i = 1; i < argc; i++)
fprintf(stream, "%s\n", argv);
}
else
{
/* 標準入力を処理 */
}
return 0;
}
のようなことを想定しているのでは?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 13:49
by 天和
>softyaさん
すいませんそもそもパラメータって何ですか?
調べても媒介変数としか出てこないんですが。
>nonさん
>実行のやり方は?
>まさかとは思うけど、パラメータを与えてないということはないですよね
???普通に>-n 3 -s "hello" と入力するか-s"hello" -n 3と入力するだけですよ?
(もちろん数字や言葉は自由に変えれる)ただエラー処理は課題に適当に促してくださいと書いてあるんですが・・・
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 15:29
by softya
みんなザックリとパラメータと呼んでますが、正確には「コマンドライン引数」と呼びます。
http://www9.plala.or.jp/sgwr-t/c/sec11-4.html
http://www.geocities.jp/ky_webid/c/045.html
>-n 3 -s "hello"
と言う書き方は、コマンドライン引数の書き方としてはかなり一般的な書き方です。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:03
by 天和
>softyaさん
はいパラメータの設定はまったくやってませんね
どうやらリンク先ではプログラムの引数で何かやるみたいですがどこにあるんでしょう?
(画像から)
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:09
by box
>例えばコマンドプロンプトで (アプリケーションのあるアドレス)> test.exe asと打つと(半角スペースあけておかなければならない)
実行時、プログラム名の直後に、スペースを1個以上あけながら
実行プログラム -n 3 -s "hello" <Enter>
と入力する仕様である、ということは理解されているのですよね?>質問者さん
# hello の前後のダブルクォーテーションは必要なのだろうか?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:14
by 天和
>boxさん
>実行時、プログラム名の直後に、スペースを1個以上あけながら
>実行プログラム -n 3 -s "hello" <Enter>
>と入力する仕様である、ということは理解されているのですよね?>質問者さん
はい理解してます層じゃないと~はバッチとして認識されませんとかでますので
># hello の前後のダブルクォーテーションは必要なのだろうか?
もちろんですそれが今回の課題ですこれが例えば"good"だとしたらその間の文字を-nの数字の後の回だけ
繰り返さなければならないですから
例(-n 5 -s "good")だったら
good good good good goodと出なければなりません
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:19
by box
>例(-n 5 -s "good")だったら
>good good goodと出なければなりません
コマンドライン引数で
good と入力するだけで、文字列データの中に「good」が入ることは
理解されていますね?
つまり、"good" と入力すると、文字列データ「そのもの」にダブルクォーテーションを含みます。
good を所定の回数だけ出力するには、文字列データの最初と最後の
ダブルクォーテーションを自分で取り除く必要があります。この点も大丈夫ですね?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:29
by 天和
>boxさん
>コマンドライン引数で
>good と入力するだけで、文字列データの中に「good」が入ることは
>理解されていますね?
はい理解してます
>つまり、"good" と入力すると、文字列データ「そのもの」にダブルクォーテーションを含みます。
good を所定の回数だけ出力するには、文字列データの最初と最後の
ダブルクォーテーションを自分で取り除く必要があります。この点も大丈夫ですね?
問題はそこなんですよねそもそもどうやってコマンドライン使ってそれを可能にするかですが・・・
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:30
by non
よくわかりませんねぇ。
コマンドプロントウィンドウを出して、実行ファイル(test.exe)を
探して、そのディレクトリに移動して下さい。
私は、VisualC++を使ってないからよくわからないけど、ありますか?
Release でなくてもよかったのですかね?
あるなら、
プロンプトの後に
>test -n 3 -s "hello"
と入力してください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:32
by たかぎ
ダブルクォーテーションを取り除く必要があるかどうか、最初に自分で貼付けられたヒントと称するプログラムで確認してみては?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:37
by box
仮に、コマンドライン引数の与え方を
実行ファイル名 -n 回数 -s "出力したい文字列"
の形式に固定します。実際の仕様は、回数と出力したい文字列の順序が
逆でもかまわないようになっていますが、簡単のためです。
このとき、main関数の第1引数argcの値は5で、
第2引数argv[/url]の値は、順に
argv[1]:-n
argv[2]:回数の文字列
argv[3]:-s
argv[4]:"出力したい文字列"
であることを確認するだけのプログラムを書いてみてください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:45
by softya
>はいパラメータの設定はまったくやってませんね
>どうやらリンク先ではプログラムの引数で何かやるみたいですがどこにあるんでしょう?
デバッグのタブで設定します。
コマンド引数ってのがそれです。
># hello の前後のダブルクォーテーションは必要なのだろうか?
>ダブルクォーテーションを自分で取り除く必要があります。この点も大丈夫ですね?
boxさんも間違っています。
いちどやってみれば分かりますよ。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:46
by 天和
>高木さん
あれ?””が消えて表示される・・・・
>>boxさん
#include<stdio.h>
int main(int argc, char *argv[/url]){
int i;
i = 0;
while(i < argc){
printf("argv[%d]%s\n",i ,argv);
i++;
}
return 0;
}
こうですか?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:47
by たかぎ
こういうことがあるので、初心者が十分に理解しないままIDEに手を出すのはお勧めしません。
まったく本質ではないところで、これほど混乱しているわけですから。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:51
by non
ようするに最初のヒントを試していなかったってことですね。
あれほど、前のスレッドで結果はどうですかって尋ねられていたのにね。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:52
by たかぎ
> あれほど、前のスレッドで結果はどうですかって尋ねられていたのにね。
C言語より先に国語を勉強したほうがよい典型的な例のようです。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 16:55
by softya
ダブルクオートの存在意義は、
1.test -n 3 -s "hello boy"
2.test -n 3 -s hello boy
の2つの違いを試してみると分かります。
> あれほど、前のスレッドで結果はどうですかって尋ねられていたのにね。
私も試すように何度も言ったんですけどね。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:01
by box
>boxさんも間違っています。
>いちどやってみれば分かりますよ。
はい。間違っていました。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:06
by box
> こうですか?
for文で書く方が簡単かとは思いますが、
それと同じ効果を持つwhile文で書いていますので、
コマンドライン引数の内容を確認するコードとして正しいです。
ていうか、ご自分でも確認されたのですよね?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:19
by 天和
>>ALL
ほんとすいません・・・実行してもファイル名とかがでるだけでまさか”が消えるとは思わなかったもので・・・
>>softyaさん
違い確認できました
””で囲まれてる間はスペース無視ではいるようですね
(画像参照)
>boxさん
はいまあ・・・一応念のためにと
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:28
by たかぎ
ところで話を最初に戻すと...
> -n 3 -s "hello" と入力するか-s"hello" -n 3と入力したら
とのことですから、後者は -s と "hello" の間に空白がありません。
つまり、
argv[1]-shello
となると思います。
それでも正しく処理できないといけないわけです。
私が書いたコードが倍ぐらい複雑になってしまった理由はここにあります。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:32
by non
>私が書いたコードが倍ぐらい複雑になってしまった理由はここにあります。
ですよね。だから、-sの後にスペースがあるのかないのか質問しました。
質問者と次元が違いすぎましたね。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:34
by 天和
>高木さん
すいません・・・スペース入力を忘れたばっかりに
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:36
by box
実行ファイル名 -n 回数 -s 文字列
または
実行ファイル名 -s 文字列 -n 回数
のいずれかの形式で文字列と出力回数を与えます。
ということは、
argv[1]が"-n"で、かつ、argv[3]が"-s"であるか、(※1)
または、
argv[1]が"-s"で、かつ、argv[3]が"-n"である(※2)
のいずれかであることを求めています。
これ以外は、コマンドライン引数の与え方が間違っていますので、
エラーメッセージか何かを出して終了します。
さて、(※1)のケースでは、
argv[2]に回数(数値ではなくて文字列)が、
argv[4]に出力したい文字列が入っています。
argv[2]の文字列を数値に変換する必要があります。
安直なのはatoi関数とかatol関数を使うことですが、
識者のかたがたから「エラーチェックしてへんやんけ」という
突っ込みが入りそうですので、ここはstrtol関数を使うのがよさそうです。
これで、回数(数値)と文字列を得ることができました。
後は、for文か何かでその回数だけループさせ、そのループの中で
文字列を出力すればよいです。
(※2)のケースは、(※1)のargv[2]とargv[4]とを逆にすればよいです。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:36
by たかぎ
> すいません・・・スペース入力を忘れたばっかりに
まあ、半角/全角を混在させる人に比べればずっとましです。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:37
by softya
>それでも正しく処理できないといけないわけです。
>私が書いたコードが倍ぐらい複雑になってしまった理由はここにあります。
この問題は、コマンドライン引数の使い方とポインタの学習だと思うので、たかぎさんの複雑なコードがいる状況が不思議でなりません。
-s"hello" -n 3
自体が間違いじゃないかと疑っています。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:49
by たかぎ
boxさん
> 安直なのはatoi関数とかatol関数を使うことですが、
> 識者のかたがたから「エラーチェックしてへんやんけ」という
> 突っ込みが入りそうですので、ここはstrtol関数を使うのがよさそうです。
atoi/atolにせよ、strtol/strtoulにせよ、符号を許してしまうのでどうかと思います。-n +3 のようにしてもよいならかまいませんが...。
また、-n " 3" のように指定されるかもしれません。
私のコードでは、符号を許さないようにしたため、さらに倍ぐらい複雑になってしまいました。
softyaさん
> この問題は、コマンドライン引数の使い方とポインタの学習だと思うので、たかぎさんの複雑なコードがいる状況が不思議でなりません。
天和さんがどういう立場の人で、どこまでわかっていて、どんな目的で取り組んでいるのかさっぱりわかりませんので、そういう決めつけはよくないのでは?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:58
by softya
>天和さんがどういう立場の人で、どこまでわかっていて、どんな目的で取り組んでいるのかさっぱりわかりませんので、そういう決めつけはよくないのでは?
たしかに、そうですね。
とりあえず天和さん、問題の出所などを明確にしてもらうと本質的な問題に集中できますのでお願いします。
調べてみたところ、天和さんが参考にしている明解C言語にはこんな演習は無いみたいですが。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 17:59
by box
あまり細かいことを言い出すときりがなくなりそうです。
ここはstrtolあたりを使うことでじゅうぶんではないかと思います。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:04
by 天和
>>softyaさん
>たしかに、そうですね。
とりあえず天和さん、問題の出所などを明確にしてもらうと本質的な問題に集中できますのでお願いします。
調べてみたところ、天和さんが参考にしている明解C言語にはこんな演習は無いみたいですが。
とりあえず問題自体は大学の先生が作ったオリジナル問題なので出所はちょっとわかりません
そしてsoftyaさんのいうとおりポインタの練習とコマンドラインの練習のためにつくったようです
(課題名がコマンドライン・スイッチの実装になっているため)
またsoftyaさんのいうとおり-s"hello" -n 3 は間違いです-s "hello" -n 3
ときちんと半角スペース入れるのが正解です。まさか半角スペース一個でここまでもんだいになるとは
思わなかったのでほんとすいません。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:16
by 天和
一応自分なりにプログラム組んでみました(かなりだめだめですが・・・)
#include<stadio.h>
int main(int argc, char *argv[/url]){
int i;
int x;
i = 0;
x = 0;
while(i < argc){ /*まずこの中に-nが入ってないか探す*/
if(argv = '-n')/*もしも文字列に-nがはいっていたらつぎの数値の分だけ繰り返す変数を代入しなさい*/
{i++; /*もし-nがあったら次の配列は確実に数字なので文字列を繰り返す分のxにその数値を代入する*/
x = argv;
break;}
i++;
}
i = 0;
while(i < x){/*さきほどやった-nの分だけ繰り返しなさい*/
while(i < argc){/*まずこの中に-sが入ってないか探しなおかつあったらなら次の配列を出力しなさい*/
if(argv = '-s')
{i++;
printf("%s\n", argv);/*もし-sがあったら次の配列は確実コピーしたい文字列なのでなのでそれをしゅつりょくしなさい*/
break;}
i++;
}
i = 0;/* while(i < x)がなりたつまでiに0を代入しさっきと同じ作業を繰り返しなさい*/
}
return 0;
}
エラー内容
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(8) : error C2440: '=' : 'int' から 'char *' に変換できません。
1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(9) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(10) : error C2065: ' ' : 定義されていない識別子です。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(10) : error C2146: 構文エラー : ';' が、識別子 'x' の前に必要です。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(10) : error C2440: '=' : 'char *' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp(17) : error C2440: '=' : 'int' から 'char *' に変換できません。
1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
1>ビルドログは "file://c:\Users\ozaki\Desktop\C++\project\switch\switch\Debug\BuildLog.htm" に保存されました。
1>switch - エラー 12、警告 0
charからint二変換できないといっているので
これ→<stdlib.h> int atoi(const char *argv)を使うんでしょうか?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:19
by たかぎ
ものすごく基本的なことですが...
> 1>c:\users\ozaki\desktop\c++\project\switch\switch\switch.cpp
C++なのでしょうか?
改めて規約を熟読した上で、必要な情報をきちんと提示してください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:25
by 天和
いえつかっているのはVISUAL C++ですが
習っているのはあくまでC言語です。
OSはwindows VISTAです
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:31
by たかぎ
> 習っているのはあくまでC言語です。
では、なぜC++でコンパイルしているのですか?
何度も言いますが、
改めて規約を熟読した上で、必要な情報をきちんと提示してください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:49
by 天和
最初、プログラムをやるときにすすめられたコンパイラが
VISUAL C++なんです大学でもVISUAL c++はつかってもいいですか?
ときいたら「いいよ」といわれたのでC言語の授業でもこのコンパイラを使っています。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:50
by softya
如何にも学生が書くであろうコードを作ってみました。
天和さんが書いたコードを見る限り、たどり着くのはずいぶん先になりそうなので。
次のことを守ってください。
1.このコードをそのまま教授には提出しないでください。
2.エラー処理が一切ありません。自分で習った範囲でエラー処理を追加してください。
3.わざとバグが作ってあります。
4.コメントを自分で入れてください。
5.使っている関数が使っても良いかは、習っている事と照らし合わせて考えてみてください。
よろしくお願いします。
ちなみに
ViusalC++でC言語としてコンパイルするためには、
・ファイルの拡張子を.cとする
か
・「プロジェクト」→「xxxのプロパティ」→「構成のプロパティ」→「C/C++」→「詳細」→「コンパイル言語の選択」で「Cコードとしてコンパイル(/TC)」を選択。
のどちらかの方法で行ってください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:51
by たかぎ
Visual C++を使うこと自体は問題ありません。
なぜ、Cではなく、C++でコンパイルしているんですか? と尋ねているのです。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:52
by non
天和さんへ
学校で使っているコンパイラは何ですか?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:56
by 天和
学校で標準使用されているのは
macのUNIX?というやつなんですが(実際はターミナルでコマンド入れてやるコンパイラ)
実際、みんな使っているコンパイラはばらばらで上記のターミナルだったりxcodeだったり
自分みたいにVISUAL C++だったりします。(学校でもプライベートでも使用してます)
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 18:58
by 天和
>softyaさん
かしこまりましたルールを守って使わせていただきます。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 19:03
by たかぎ
天和さんは学生なのでしょうか?
問題は大学の先生が作ったらしいですが、だからといって天和さんが学生ということにはなりませんよね。
> macのUNIX?というやつなんですが(実際はターミナルでコマンド入れてやるコンパイラ)
> 実際、みんな使っているコンパイラはばらばらで上記のターミナルだったりxcodeだったり
> 自分みたいにVISUAL C++だったりします。(学校でもプライベートでも使用してます)
PCは自前なのでしょうか?
さっぱり状況がわかりませんが、Visual StudioのようなIDE(統合開発環境)は、わかっていて使うならよいのですが、そうでないなら本質ではない部分で頻繁に混乱することになると思います。
たとえうまくいっても、半分も理解できていない場合があります。
初心者向きではないんです。
今回も、どうやらCとC++の使い分けも分からなかったようですが、コマンドラインコンパイラならこんな問題が起きる可能性は激減します。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 19:22
by 天和
>高木さん
自分大学の学生です
>PCは自前なのでしょうか?
さっぱり状況がわかりませんが、Visual StudioのようなIDE(統合開発環境)は、わかっていて使うならよいのですが、そうでないなら本質ではない部分で頻繁に混乱することになると思います。
たとえうまくいっても、半分も理解できていない場合があります。
初心者向きではないんです。
今回も、どうやらCとC++の使い分けも分からなかったようですが、コマンドラインコンパイラならこんな問題が起きる可能性は激減します。
PCは大学から支給されているやつをつかっています(ただし今現在書き込みをしているのは自宅のPCです)
もちろんどっちともウィンドウズビスタですが大学から支給されているのはmacもつかえます
Visual StudioのようなIDE(統合開発環境)ですがやはりやめたほうがよいのでしょうか?
マックのUNIX?(ターミナルでやるもの)もあるんですがあちらはコンパイルした後デバックしたり
エラーがないかチェックするのにいちいちコンパイルから抜け出してコマンドうったりしないといけないので・・・(xcodeというのもありますがあれもたぶんIDE?)
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 19:35
by たかぎ
> PCは大学から支給されているやつをつかっています(ただし今現在書き込みをしているのは自宅のPCです)
> もちろんどっちともウィンドウズビスタですが大学から支給されているのはmacもつかえます
大体分かってきました。
つまり、Macを使って、BootCampかVMware FusionあたりでVistaを起動しているわけですね。
> Visual StudioのようなIDE(統合開発環境)ですがやはりやめたほうがよいのでしょうか?
もし、大学の講義がGCCで行われているのであれば、とりあえずはGCCを使うほうがよいと思います。
> マックのUNIX?(ターミナルでやるもの)もあるんですがあちらはコンパイルした後デバックしたり
> エラーがないかチェックするのにいちいちコンパイルから抜け出してコマンドうったりしないといけないので・・・(xcodeというのもありますがあれもたぶんIDE?)
コンパイルから抜けるという意味がわかりません。
コンパイルが終わらないとデバッグできないと思いますが...
それから、この程度のプログラムであれば、デバッガの出番はないと思います。
printfデバッグでも十分ですね。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 20:13
by softya
天和さんのコードの最大の問題点だけ指摘しておきます。
if(argv = '-s')は重症な理解不足です。
文字リテラルと、文字列の区別が出来ていませんのでちゃんと勉強してください。
文字リテラルは数値データ。文字列はchar*型のデータです。
特に文字列はポインタと密接に結びつきますので、ポインタの理解のためにも文字列について調べてください。
>Visual StudioのようなIDE(統合開発環境)ですがやはりやめたほうがよいのでしょうか?
どちらかと言うと、たかぎさんが問題にしたいのはあいまいな開発環境を許可した教授であって天和さんに罪はありません。たかぎさんと意見は違いますが、私の書いたC言語でコンパイルする方法を守っていただければ問題ないと思います。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 20:21
by 天和
>たかぎさん
すいませんGCCというのはMACのターミナルのことでしょうか?
えーとソースをある程度修正してきましたが・・・
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[/url])
{
int i;
int y;
i = 1;
y = 1;
int x;
x = 0;
while(i < argc )
{
if( 0 == strcmp(argv,"-n") ) /* もし-nだったらつぎの配列に行きなさい*/
{i++;
int atoi(const char *argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
x = argv;
break;}
i++;
}
i = 0;
while(y < x){
while(i < argc)
{
if( 0 == strcmp(argv,"-s") ) /*もしも-sがあったら次の配列に行きなさい*/
{i++;
printf("%s ", argv);/*つぎのはいれつは必ず繰り返させたい文字なのでそれを出力させなさい*/
break;}
i++;
}
i = 0;
y++;}
return 0;
}
エラー内容
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(17) : error C2440: '=' : 'char *' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
1>ビルドログは "file://c:\Users\ozaki\Desktop\C++\project\switch2\switch2\Debug\BuildLog.htm" に保存されました。
1>switch2 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
です
int atoi(const char *argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
をやっているのになぜcharからintに変換できない?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 20:45
by 天和
失礼
上のソースコードはsoftyaさんの書き込み見る前に修正してますので
if(argv = '-s')は修正してませんので。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 20:53
by box
もしよかったら、私の42870をごらんになってください。
あくまでも一つの例ですけれど。
とにかく、問題を小分けにして解決していきましょう。
1)コマンドライン引数の並びが正しいかどうかをチェック
・エラーのとき、プログラムを終了
2)コマンドライン引数から、出力回数を示す文字列と、出力したい文字列を取得
3)出力回数を示す文字列を数値に変換
4)前項で数値に変換した値の回数だけ、2)で取得した文字列を出力
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:10
by Hermit
たぶんその部分は、
if (0 == strcmp(argv, "-n")) { /* もし-nだったらつぎの配列に行きなさい */
i++;
x = atoi(argv); /* ここでプロトタイプ宣言するのは変です */
/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
break;
}
でいいのではないかな。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:21
by たかぎ
softyaさん
> たかぎさんと意見は違いますが、
意見はいろいろあってよいと思います。
ただ、今回にかぎれば...
> 私の書いたC言語でコンパイルする方法を守っていただければ問題ないと思います。
上記のアドバイスは伝わっていないようです。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:32
by たかぎ
> すいませんGCCというのはMACのターミナルのことでしょうか?
GCCというのは、GNU Compiler Collectionの意味です。ターミナルではありません。
Xcodeについてくるのは、C, C++, Objective-C, Objective-C++に対応したコンパイラです。
ターミナルから、gccというコマンドを打ちますが、これがGCCでCまたはObjective-Cをコンパイルするときのコマンドです。
C++またはObjective-C++をコンパイルするときはg++というコマンドを使います。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:44
by 天和
>高木さん
>>私の書いたC言語でコンパイルする方法を守っていただければ問題ないと思います。
>上記のアドバイスは伝わっていないようです。
いや、C言語にしたとたんとんでもなくエラーがでまして・・・
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[/url])
{
int y;
i = 1;
y = 1;
int x;
x = 0;
while(i < argc )
{
if( 0 == strcmp(argv,"-n") ) /* もし-nだったらつぎの配列に行きなさい*/
{i++;
int atoi(const char *argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
x = argv;
break;}
i++;
}
i = 0;
while(y < x){
while(i < argc)
{
if( 0 == strcmp(argv,"-s") ) /*もしも-sがあったら次の配列に行きなさい*/
{i++;
printf("%s ", argv);/*つぎのはいれつは必ず繰り返させたい文字なのでそれを出力させなさい*/
break;}
i++;
}
i = 0;
y++;}
return 0;
}
エラー内容
1>------ ビルド開始: プロジェクト: switch2, 構成: Debug Win32 ------
1>コンパイルしています...
1>switch.cpp
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(10) : error C2143: 構文エラー : ';' が '型' の前にありません。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(11) : error C2065: 'x' : 定義されていない識別子です。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(16) : error C2143: 構文エラー : ';' が '型' の前にありません。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(17) : error C2065: 'x' : 定義されていない識別子です。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(17) : warning C4047: '=' : 間接参照のレベルが 'int' と 'char *' で異なっています。
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(22) : error C2065: 'x' : 定義されていない識別子です。
1>ビルドログは "file://c:\Users\ozaki\Desktop\C++\project\switch2\switch2\Debug\BuildLog.htm" に保存されました。
1>switch2 - エラー 5、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
例えば
1>c:\users\ozaki\desktop\c++\project\switch2\switch2\switch.cpp(10) : error C2143: 構文エラー : ';' が '型' の前にありません。
y = 1;
int x;←これではだめなの?
x = 0;
とか
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:52
by 天和
>Hermitさん
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[/url])
{
int i;
int y;
i = 1;
y = 1;
int x;
x = 0;
while(i < argc )
{
if( 0 == strcmp(argv,"-n") ) /* もし-nだったらつぎの配列に行きなさい*/
{i++;
x = atoi(argv);/*-nのつぎは必ず数字なのでxに繰り返す分を代入させる*/
break;}
i++;
}
i = 0;
while(y < x + 1){
while(i < argc)
{
if( 0 == strcmp(argv,"-s") ) /*もしも-sがあったら次の配列に行きなさい*/
{i++;
printf("%s ", argv);/*つぎのはいれつは必ず繰り返させたい文字なのでそれを出力させなさい*/
break;}
i++;
}
i = 0;
y++;}
return 0;
}
でできましたありがとうございます。(c++)で
ってあれ?C言語にしても急にエラーがなくなった。
なんでだろう?
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:54
by たかぎ
> いや、C言語にしたとたんとんでもなくエラーがでまして・・・
規約にもあるように、「今行いたいことは何か」がよく分かりません。
C言語でプログラムを書くのであれば、C言語としてコンパイルするのが当然です。
C++とCは別の言語ですので、C++としてコンパイルしても無意味です。
> y = 1;
> int x;←これではだめなの?
> x = 0;
> とか
結局振り出しに戻ってしまいますが、C99ならOKです(この部分だけの話です)。
GCCの場合、-std=c99または-std=gnu99オプションを付けてコンパイルしてください。
Visual C++では(C言語としては)コンパイルできません。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 21:59
by Hermit
・・・・・
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 22:00
by 天和
すいませんなぜかC言語にしても急にエラーがなくなりました。
最後に自分のへまなせいでたかぎさんに余分なプログラムを書くようさせてしまい申し訳ありませんでした
またsoftyaさん、nonさんを含むみなさまにもあきられながらも最後まで回答していただきまことにありがとうございました。
そして最後の最後で助け舟を出してくれたhermitさんありがとうございましたおかけで最後の仕上げができました。
では今日はここで閉め知らせていただきますみなさんありがとうございました。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 22:06
by たかぎ
> すいませんなぜかC言語にしても急にエラーがなくなりました。
多分、何かの間違いです。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 22:17
by softya
y = 1;
int x;←これではだめなの?
x = 0;
VC++のC言語だとだめですね。
宣言は、実行文より先にしてください。
>上記のアドバイスは伝わっていないようです。
エラーが出るから止めるってのは間違ってますね。
とりあえず、C言語には年代別に規格がありましてC89,C95,C99と呼ばれています。
問題なのは、C99規格で書いて良いかって事です。VC++2008のCコンパイラは、C95をほぼ網羅してますが、C99には準拠していません。
もし、C99で書きたいなら私も高木さん推薦のgccを選ぶべきだと思いますね。C++でC99もどきのコンパイルは止めたほうが良いです。VC++でコンパイルが通っても、gccでコンパイルが通らないコード作っても提出できないですからね。
あるいは、C95規格に則って書いてコードを書いてVC++のCコンパイラでもコンパイルが通るようにする事です。そうすればgccでもコンパイルが通ります。どちらかを選んでください。
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 22:18
by Hermit
とりあえず、どうにかなったみたいですね。
終わったみたいなので、私だったらこんな感じに書くかなって事で書いて遊んでみました。
#include <stdio.h>
#include <string.h>
#define NSTR "-n"
#define SSTR "-s"
e_exit(err)
int err;
{
fprintf(stderr,"Error");
exit(err);
}
main(argc,argv)
int argc;
char *argv[/url];
{
int argcount;
size_t optlen;
int n = 0;
char *s = "error\n";
// set -n
optlen = strlen(NSTR);
for (argcount = 1; argcount < argc; argcount++) {
if (strncmp(NSTR,argv[argcount],optlen) == 0) {
char *optstr = &argv[argcount][optlen];
if (*optstr == '\0') {
optstr = argv[argcount+1];
if (optstr == NULL)
e_exit(1);
}
n = atoi(optstr);
}
}
// set -s
optlen = strlen(SSTR);
for (argcount = 1; argcount < argc; argcount++) {
if (strncmp(SSTR,argv[argcount],optlen) == 0) {
char *ptr = &argv[argcount][optlen];
if (*ptr == '\0')
s = argv[argcount+1] ? argv[argcount+1] : s;
else
s = ptr;
}
}
// printf("-n = %d\n-s = %s\n",n,s);
while (n-- > 0)
printf("%s%c",s,n?' ':'\n');
return 0;
}
オプションがもっと増えるようだったら、
関数処理にするでしょうが、高々2個なので、
同じような処理を二つ羅列してます。
エラー処理は適当です(^^;
Re:コマンドプロンプト
Posted: 2009年11月29日(日) 22:23
by たかぎ
Hermitさん
//で始まる1行コメントのC99からの仕様ですね。
Visual C+でもコンパイルはできますが、そういう問題ではない気がします。
それに、C99だとintの省略はできませんし。
Re:コマンドプロンプト
Posted: 2009年11月30日(月) 00:41
by Hermit
ターゲットは VC++ だと書いてあったと思いましたが違ってましたか?
まあ、動かなければそれなりに動くようにするのが、プログラマだから、
気になるなら、質問するんじゃないでしょうか。
という意味で、新旧織り交ぜて描いています(えがいています)
飲み込まれるような不思議な映像
Posted: 2009年12月05日(土) 00:58
by 初心者
ユーチューブで
飲み込まれるような不思議な映像
http://www.youtube.com/watch?v=jqK2eR3f ... re=related
という動画をみたのですが、
これはDXライブラリで再現できないでしょうか?
Re:飲み込まれるような不思議な映像
Posted: 2009年12月05日(土) 02:31
by Justy
3D機能を使えば出来ると思います。
やりかたはいろいろあるでしょうが、大きく分けるとモデルを使うか使わないかで
分けられます。
モデルを使うなら例えば
・ モデリングソフトでこういう形状をモデリングする
・ カメラパス(位置と向き)をつくる
・ モデルを表示し、カメラパスの通リカメラ(或いは背景)を動かす
で、できるんじゃないかと。
ただ実際に延々とループを続けるには背景モデルの先端と終端が形状的にうまく繋がるように
作っておく必要があるのと、カメラの向きはアニメーション通りに再生するけど
位置は原点に固定して代わりに背景を反対方向に動かさないと、どこかで破綻しそうです。
あぁ、でも動画をよくみるとカメラパスの向きの方は必要なさそうです。
数フレーム先の位置と今の位置とで目標となるベクトルを出して、
現在の向きとの間で適当に補完すれば出せそうです。
あとなんとなく道(?)の中心から少し外れたところを移動している時があるようにも見えます。
そうならパスは中央を通るように作っておいて、実際に動かすときに慣性をつけて
位置を補正すれば、曲がるときは軌道が外側に膨らむようなるはずです。
反対にモデルを使わない場合は
・ 道の通過点を幾つかランダムかなにかで決めて、その間の道をスプラインで補完。
・ ルートがある程度確定したら、そのルートを元に周囲のポリゴンをソフト的に計算し、
テクスチャを貼る。
・ ルートからカメラの位置と向きを計算します。
これを延々と繰り返せば出来そうです。
# モデルを使わず動的にランダムでルートを造った方が不規則な道・動きになるので
面白いのかもしれませんね。
Re:飲み込まれるような不思議な映像
Posted: 2009年12月05日(土) 03:32
by 初心者
モデルは全く勉強してないので、今の段階ではちょっと作成しようがないですorz
サンプルどなたか作成していただけないでしょうか?
ふと、思ったのですが、管理人さんの新作ゲームのメイン画面に似てますね。この動画。
Re:飲み込まれるような不思議な映像
Posted: 2009年12月07日(月) 21:53
by 山崎
確かに凄い動画ですね。これ。
DXライブラリで挑戦してみたいですね
Re:飲み込まれるような不思議な映像
Posted: 2009年12月07日(月) 22:36
by 山崎
ひとつ上の山崎さんのコメントは、
私と同じHNの山崎さんの投稿のようですね。
他の記事で爆発のエフェクトのことを質問している山崎ではないですので・・・。
別に敢えて言う必要も無いとは思いますが、念のため。
Re:飲み込まれるような不思議な映像
Posted: 2009年12月10日(木) 20:51
by 初心者
これに近いサンプル的なものはないでしょうか?