C言語なら俺に聞け(入門篇) Part 34
レス数が1000を超えています。これ以上書き込みはできません。
0001静的領域の名無しさん
2008/08/12(火) 18:23:10教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題を片付けます 114代目
http://pc11.2ch.net/test/read.cgi/tech/1216746971/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 33
http://pc11.2ch.net/test/read.cgi/tech/1217073697/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002静的領域の名無しさん
2008/08/12(火) 18:24:48C/C++の宿題を片付けます 115代目
http://pc11.2ch.net/test/read.cgi/tech/1217741118/
0003デフォルトの名無しさん
2008/08/12(火) 18:47:270004デフォルトの名無しさん
2008/08/12(火) 18:59:01>>1乙
0005デフォルトの名無しさん
2008/08/12(火) 19:35:35コンパイラがあると便利なのですけど、無料のコンパイラとかあるのでしょうか。
0006デフォルトの名無しさん
2008/08/12(火) 19:41:200007デフォルトの名無しさん
2008/08/12(火) 20:20:22ありがとうございます。
いろいろ検索して、LSI C-86 というものを今インストールしてみました。
まったくの初心者なのでこれで十分かと思ってます。
C言語のことほとんど知らないのですが、DOSプロンプトみたいな画面に
文字が出てくるのですね。びっくりしました。
0008デフォルトの名無しさん
2008/08/12(火) 20:25:26昇順にソートする一番早い方法はなんですか?
0009デフォルトの名無しさん
2008/08/12(火) 20:29:000010デフォルトの名無しさん
2008/08/12(火) 20:34:16入れ子のif/else文を書く
0011デフォルトの名無しさん
2008/08/12(火) 20:37:320012デフォルトの名無しさん
2008/08/12(火) 20:42:27話はそれからだ
0013デフォルトの名無しさん
2008/08/12(火) 20:42:36printf関数とかって
どうやってディスプレイに文字を表示させてるんだ?
0014デフォルトの名無しさん
2008/08/12(火) 20:45:270015デフォルトの名無しさん
2008/08/12(火) 20:47:44そうしてます。質問の仕方が悪かったです。すいません
int data[3]に入れています。
0016デフォルトの名無しさん
2008/08/12(火) 20:48:20LSI-C試食版は(スモールモデル限定だから)大きいプログラムには向かないかもしれません。
あと、フリーならば Borland C か cygwin の gcc があります。
0017デフォルトの名無しさん
2008/08/12(火) 20:49:45generic なかきかたには負けてしまいますが、普通の c でかくなら最速だと思います。枯れているでしょうし。
0018デフォルトの名無しさん
2008/08/12(火) 20:51:07全要素が同じかどうかわかるようなやつです。
strcmpみたいな
0019デフォルトの名無しさん
2008/08/12(火) 20:51:37好きにやれば良いよね
0020デフォルトの名無しさん
2008/08/12(火) 20:51:38OSがドライバとの間の仲介をしてくれる
これがハードウェアを操作する手順
printf→OS→ドライバ
0021デフォルトの名無しさん
2008/08/12(火) 20:55:053件しかデータがないなら、オーバヘッドがある分確実にqsort()は無駄です。
>7
LSI-Cは整数型が16ビットしかないので、学習には全くお勧めできません。
>>18
memcmp()でできますが、自分でループを書いたほうがいいかも知れません。
0022デフォルトの名無しさん
2008/08/12(火) 20:55:23自分でループを書いたほうがいい理由はなんですか?
0023デフォルトの名無しさん
2008/08/12(火) 20:58:43自分でmemcmp()に辿り着けないレベルなら、勉強になるジャマイカ。
0025デフォルトの名無しさん
2008/08/12(火) 21:20:58strcat(buff1,buff2)ってできませんか?
0026デフォルトの名無しさん
2008/08/12(火) 21:22:390027デフォルトの名無しさん
2008/08/12(火) 21:24:26対策を教えてください
0028デフォルトの名無しさん
2008/08/12(火) 21:26:11実行しない
0029デフォルトの名無しさん
2008/08/12(火) 21:26:30できますが、事前に充分な格納場所を割り当てることを忘れずに。
0030デフォルトの名無しさん
2008/08/12(火) 21:30:570031デフォルトの名無しさん
2008/08/12(火) 22:02:52buff1="abc";
buff2="testtest";
みたいに結合前に代入しているんですが・・・
0032デフォルトの名無しさん
2008/08/12(火) 22:08:25だからbuff1に十分な場所がないとだめだとみんなが。
そもそもそれ以前の話だけどね
0033デフォルトの名無しさん
2008/08/12(火) 22:12:03それ以前の話とはchar buff1="abc";
この宣言がよくないですか?
0034デフォルトの名無しさん
2008/08/12(火) 22:14:14char buff1[256];
とか[]の中の数字を大きくするか
mallocで動的に確保するかしかないよ
0035デフォルトの名無しさん
2008/08/12(火) 22:15:42俺ツタヤ行くから誰かが教えてくれるはず
0036デフォルトの名無しさん
2008/08/12(火) 22:16:050037デフォルトの名無しさん
2008/08/12(火) 22:21:11質問内容から察するに
前提条件から書かないと
質問者には意味が分からないはず
0038デフォルトの名無しさん
2008/08/12(火) 22:30:390039デフォルトの名無しさん
2008/08/12(火) 22:32:48何を言っているんだ?
0040デフォルトの名無しさん
2008/08/12(火) 22:34:180041デフォルトの名無しさん
2008/08/12(火) 22:36:48realloc(foo, 0); // same as free(foo);
00427
2008/08/12(火) 22:39:3065535までの数しか扱えないみたいですね。
でも、今週から本買って始めた超初心者ですので、とりあえずこれで頑張ってみます。
0043デフォルトの名無しさん
2008/08/12(火) 22:40:03なるほど勉強になった。で、何の話だっけ?
0044デフォルトの名無しさん
2008/08/12(火) 23:02:47別にMSの回し者じゃないが
個人的には>>6が良いと思うけどなぁ
0045デフォルトの名無しさん
2008/08/12(火) 23:40:480046デフォルトの名無しさん
2008/08/12(火) 23:44:170047デフォルトの名無しさん
2008/08/13(水) 00:18:510048デフォルトの名無しさん
2008/08/13(水) 00:21:460049デフォルトの名無しさん
2008/08/13(水) 00:32:120050デフォルトの名無しさん
2008/08/13(水) 00:35:19その代わりに否定の!と三項演算子がつかえなくなるのはいやなんですが。
0051デフォルトの名無しさん
2008/08/13(水) 00:38:050052デフォルトの名無しさん
2008/08/13(水) 00:42:31ctype.h関数群の is〜、もありますね。
0053デフォルトの名無しさん
2008/08/13(水) 00:54:37そんなものはただのお前の好みであって便利でもなんでもない
0054デフォルトの名無しさん
2008/08/13(水) 01:06:02いや、使えるだろ・・・
くっつけて書かなければ
0055デフォルトの名無しさん
2008/08/13(水) 01:08:370056デフォルトの名無しさん
2008/08/13(水) 02:25:39そう作ればそうでしょうけれども。
現在の仕様では識別子の文字セットと演算子として使用する文字とはまったくかぶらないのでひっつけてかいてもOKなのです。
0057デフォルトの名無しさん
2008/08/13(水) 02:47:53Is〜 Has〜みたいにさ。
?がついたからわかりやすいんだ!という向きにはひまわりでもやってなさい、といいたい。
0058デフォルトの名無しさん
2008/08/13(水) 06:21:410059デフォルトの名無しさん
2008/08/13(水) 07:41:37あ、ゴメン、そういうの出来ないのか、そりゃ〜悪かった。
0060デフォルトの名無しさん
2008/08/13(水) 07:54:36IDE使っててそういう発想がなかったのだろうよ。或いはMakefileを書けないとか。
それはさておき。
今のところ$と@は使われていないけれど、変数名なんかに使えたっけ?
0061デフォルトの名無しさん
2008/08/13(水) 08:57:580062デフォルトの名無しさん
2008/08/13(水) 10:43:241%
2%
・
・
100%みたいに表示するのではなく
"1"% ""この数字だけ次々更新していく方法はないんですか?コンソールプログラムです
0063デフォルトの名無しさん
2008/08/13(水) 10:47:53http://www.kumei.ne.jp/c_lang/intro/no_59.htm
0064デフォルトの名無しさん
2008/08/13(水) 10:48:570065デフォルトの名無しさん
2008/08/13(水) 10:51:30標準関数では無理
対象となるコンソールのスペックによる
0066デフォルトの名無しさん
2008/08/13(水) 10:58:490067デフォルトの名無しさん
2008/08/13(水) 11:19:190069デフォルトの名無しさん
2008/08/13(水) 11:25:290070デフォルトの名無しさん
2008/08/13(水) 11:31:070071デフォルトの名無しさん
2008/08/13(水) 11:36:11エディタはどれを使えばいいの?
visual C++ってのが無料の統合開発環境らしいんでそれを使おうと思ってるんだけど
それでいいですか?
CとC++の違いがオブジェクト指向どうこうかいてあったけど
プログラムは初めてで何の事だか・・・
0072デフォルトの名無しさん
2008/08/13(水) 11:38:52取り敢えず、ソースファイルの拡張子はcppにしないように気をつけてね。
PC自体の知識と意欲があるならLinux使うなりCygwin入れるなりを薦めるけどね。
0073デフォルトの名無しさん
2008/08/13(水) 11:39:58それでいいよ
ファイルの拡張子を .c にすればCとして処理される。
標準関数が安全じゃないと警告が出るときがあるけど
0074デフォルトの名無しさん
2008/08/13(水) 11:40:12007571
2008/08/13(水) 11:46:14linuxとかが開発に向いてるってのは聞いたことあるけどプログラム初めてなんで
とりあえずお手軽なとこで・・・
>>73
初心者がちまちまやってる分には特に問題なさそうですね
どうもありがとうございました。さっそくインストールしてみます。
0076デフォルトの名無しさん
2008/08/13(水) 11:53:190077デフォルトの名無しさん
2008/08/13(水) 15:08:34IDEを使うと便利なんだけど、IDEを使えるようになるまでの苦労というものが初心者にはあるから。。
0078デフォルトの名無しさん
2008/08/13(水) 19:43:09いろんなサイト見て、ひとつ練習にプログラムを作りました。
そのあと次に新しいものを作るとき、また最初からプロジェクトとか
作る必要があるのでしょうか。「新規作成→ファイル」で作れると思ったのですが…
新しいプログラムを作るやり方を教えてください。よろしくお願いします。
0079デフォルトの名無しさん
2008/08/13(水) 19:46:24新規プロジェクトでまずいことでも?
0080デフォルトの名無しさん
2008/08/13(水) 19:57:23いえ、毎回プロジェクトから作っていく以外に方法があるのかと思った次第です。
例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと…
毎回新しくプロジェクトを作るのが当然のことでしたらそれでやるしかありませんので。
特に問題ありません。
今、いつくかのサイトで調べてみましたら、
「作成される実行ファイルは、一つのプロジェクトにつき一つだけです。 」と書いてありました。
毎回プロジェクトから作る必要があるみたいですね。
0081デフォルトの名無しさん
2008/08/13(水) 20:01:08> 例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと…
それは可能ですよ。だけど、main関数のあるファイルは追加しない。
追加するとどうなるんだ?mainが2つあるというエラーメッセージが出るんじゃないかな?
0082デフォルトの名無しさん
2008/08/13(水) 20:12:24http://pc11.2ch.net/test/read.cgi/tech/1217525513/1
0083デフォルトの名無しさん
2008/08/13(水) 22:18:191>cl : コマンド ライン error D8045 : C ファイル '.\Test.c' を /clr オプションと共にコンパイルできません
とエラーになることがあるんですけど対処法を教えてください。
0084デフォルトの名無しさん
2008/08/13(水) 22:19:56プロジェクトとmain関数の意味ググってこいやボケ
0085デフォルトの名無しさん
2008/08/13(水) 22:43:21Win32プロジェクトを作れ
0086デフォルトの名無しさん
2008/08/13(水) 23:15:520087デフォルトの名無しさん
2008/08/13(水) 23:17:500088デフォルトの名無しさん
2008/08/13(水) 23:19:470089デフォルトの名無しさん
2008/08/13(水) 23:20:180090デフォルトの名無しさん
2008/08/13(水) 23:23:330091デフォルトの名無しさん
2008/08/13(水) 23:25:430092デフォルトの名無しさん
2008/08/13(水) 23:28:220093デフォルトの名無しさん
2008/08/13(水) 23:30:03READ/DATAは当然ないし
0094デフォルトの名無しさん
2008/08/13(水) 23:30:421プロジェクト複数exeを期待したんだと思うよ
コマンドラインから入ったら結構そう期待してしまいそう
0095デフォルトの名無しさん
2008/08/13(水) 23:31:270096デフォルトの名無しさん
2008/08/13(水) 23:32:28ベーシックとFORTRANとC++とJavaとアセンブラの仕事を同時並行した俺がいる
こつ、覚えすぎないことw
0097デフォルトの名無しさん
2008/08/13(水) 23:33:110098デフォルトの名無しさん
2008/08/14(木) 00:33:540099sage
2008/08/14(木) 02:38:20例)abc,def,ghi,jkl....
皆ならどういう風にするのでしょうか?
条件)
・strtokはなし。
・分かりやすさ重視。
0100デフォルトの名無しさん
2008/08/14(木) 02:41:590101デフォルトの名無しさん
2008/08/14(木) 02:45:18以外にまっとうで安全な方法があるなら聞きたいわ
0102デフォルトの名無しさん
2008/08/14(木) 02:48:23元データを丸ごと領域確保&コピーしてカンマを\0に置換していったほうがいいんじゃないか?
0103デフォルトの名無しさん
2008/08/14(木) 02:53:32それとも多バイト文字を扱うからか?
いずれにせよ状態を保持しながら先頭から手動で一文字ずつチェックする以外ないな
0104デフォルトの名無しさん
2008/08/14(木) 03:08:591)複数の、文字列のポインタを格納できる領域を確保(固定サイズである程度大きいものor区切りの数を数える)
2)元の文字列のコピーを作成,区切りを'\0'に置き換えつつ、1)の領域へ区切りの先頭アドレスを格納していく
って感じかな
0105デフォルトの名無しさん
2008/08/14(木) 03:13:54#include <string.h>
#include <stdlib.h>
int main()
{
int i, arrylength;
char basestr[] = "abc,efg,hij,klm, , asjelrhaesh";
char **arry;
char *temp;
i = 1;
temp = basestr;
while (temp = strchr(temp, ',')) {
temp++;
i++;
}
arry = (char**)malloc(sizeof(char*) * i);
arrylength = i;
i = 1;
temp = basestr;
arry[0] = temp;
while (temp = strchr(temp, ',')) {
*temp = '\0';
temp++;
arry[i] = temp;
i++;
}
for (i = 0; i < arrylength; i++)
puts(arry[i]);
return 0;
}
異論は認める
0106デフォルトの名無しさん
2008/08/14(木) 03:26:02if(data[i]==','){
j++;
continue;
}
strncat(array[j],data[i],1)
}
0107デフォルトの名無しさん
2008/08/14(木) 07:52:20カラム数が固定じゃないなら、%[^,],%nで。
0108デフォルトの名無しさん
2008/08/14(木) 08:06:22char** tokbycomma(const char* src)
{
char** result = NULL;
char* tmp;
while((tmp = cutbycomma(src)) != NULL){
result = pushback(result, tmp);
src += strlen(tmp) + 1;
free(tmp);
}
return result;
}
cutbycommaとpushbackをどう作ればいいかは自分で考えましょう。
0109デフォルトの名無しさん
2008/08/14(木) 09:20:04double a[10]={0.0}
char *mozi;
}HOGE;
HOGE data[200];
これで宣言したらaは初期化されていますか?
0110デフォルトの名無しさん
2008/08/14(木) 09:24:56typedef struct{
double a[10]={0.0}
char *mozi;
}HOGE;
この段階だと実態は無いのでできない?
0111デフォルトの名無しさん
2008/08/14(木) 09:25:470112デフォルトの名無しさん
2008/08/14(木) 09:28:51HOGE data[200];
でも仮にかけたとしても200個とか手で書くのか?
どうせchar*もNULLでないと困るんだしどこかで
memset(data,0x00,sizeof(data));
としておけば全部0でクリアになるよ
0113デフォルトの名無しさん
2008/08/14(木) 09:31:09{
char * tmp = malloc(strlen(src) + 1);
int pos;
int rtn = sscanf(src, "%[^,\n]%n", tmp, & pos);
if (rtn != 1) {
/* 抽出不可 */
free(tmp);
return NULL;
}
if (src[pos] != '\0') /* 継続あり */;
return tmp;
}
0114デフォルトの名無しさん
2008/08/14(木) 09:31:25double a;
char *mozi;
}HOGE;
構造体はこうでした・・・
for(i=0;i<200;i++){
data[i].a=0.0;
}
とするのではどっちが早いですか?
0115デフォルトの名無しさん
2008/08/14(木) 09:34:00それでもいいなら、自前で代入するよりも速いかもしれない。
0116112
2008/08/14(木) 09:35:42intとか整数型ならいいかもしれんが実数はやめたほうがいい。
よって>>114のループで
0117デフォルトの名無しさん
2008/08/14(木) 09:46:18毎回使いもしない長さの領域を確保してるじゃん。10点。
0118デフォルトの名無しさん
2008/08/14(木) 09:56:030119デフォルトの名無しさん
2008/08/14(木) 10:41:01ひとそれぞれですし、取り組んだ課題によりさまざまな指向性を示すと思いますが、そんなことより、とりあえずやってみましょうよ。
0120デフォルトの名無しさん
2008/08/14(木) 10:44:11if(条件){
処理
break;
}
}
この場合のbreak;はif文から抜けるだけですか?それともfor文からも抜けますか?
0121デフォルトの名無しさん
2008/08/14(木) 10:52:390122デフォルトの名無しさん
2008/08/14(木) 10:53:070123デフォルトの名無しさん
2008/08/14(木) 11:47:56今、DOS画面のような画面に計算結果を出力するような練習をしています。
C言語はこういうものだという狭い認識しか無いのですが、
C言語でゲームを作るとかいう場合は、グラフィックで動くソフトか何かを使うのですか?
自分には、「C言語はDOS画面みたいなもので動かす」という固定観念があります。
今のところそれしか見たこと無いので。
0124デフォルトの名無しさん
2008/08/14(木) 11:50:29いやそんなことはないけどね。
ゲーム機の非公式開発なんかもCとかC++でかかれてたりするけど
普通にグラフィック扱ってるし。
むしろフォントの関係上英字が扱えるくらいで日本語とかになると
それなりに苦労するくらい。
0125デフォルトの名無しさん
2008/08/14(木) 12:07:12まあ標準ライブラリだけだとそうなるけど。
0126デフォルトの名無しさん
2008/08/14(木) 12:13:50あなたは幼稚園程度の英語の知識を身に着けたばかりのような状態です。
例えば不思議の国のアリスを楽しむには、イギリスの生活習慣から当時の政治情勢まで知る必要があるのです。
プログラミング言語も同じようなものです。
0127デフォルトの名無しさん
2008/08/14(木) 12:41:09そのおおもとの、足し算ってどうやって実装してるんでしょうか?
0128デフォルトの名無しさん
2008/08/14(木) 12:43:38CPUにそういう命令があって内部で計算してるの
C言語なんかはコンパイルのときにCPUがわかるように変換してる。
0129デフォルトの名無しさん
2008/08/14(木) 12:44:55組まれてて計算してる。
0130デフォルトの名無しさん
2008/08/14(木) 12:55:38半加算器、全加算器でぐぐるといいよ
0131デフォルトの名無しさん
2008/08/14(木) 13:35:260132デフォルトの名無しさん
2008/08/14(木) 13:41:19構造体だとそれなんか警告でるんだけど全部初期化されるのは保証されてるの?
0133デフォルトの名無しさん
2008/08/14(木) 13:43:22それ以前にポインター抱えてる構造体でそんな初期化って
0134デフォルトの名無しさん
2008/08/14(木) 13:51:15警告の意味くらい、理解しなさいよ。
HOGE data[200] = {{0}};
0135デフォルトの名無しさん
2008/08/14(木) 13:53:21ゼロクリアではなく、きちんとヌルポインタで初期化されるよ。
0136デフォルトの名無しさん
2008/08/14(木) 13:58:05それでもでるんですけど
01371
2008/08/14(木) 13:58:48試してから言ってくださいよw
0138デフォルトの名無しさん
2008/08/14(木) 14:09:51--
% cat foo.c
typedef struct{
double a;
char *mozi;
}HOGE;
HOGE data[200] = {0};
% gcc -c -Wall foo.c
foo.c:9: warning: missing braces around initializer
foo.c:9: warning: (near initialization for `data[0]')
% sed -e 's/{0}/{{0}}/' foo.c > fooz.c
% !g:s/foo/fooz
gcc -c -Wall fooz.c
% gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--
警告でなくなるけど。
0139デフォルトの名無しさん
2008/08/14(木) 14:20:22初期化の指定が少ない場合コンパイラが勝手にやるんだっけ?
0140デフォルトの名無しさん
2008/08/14(木) 14:26:120141デフォルトの名無しさん
2008/08/14(木) 14:36:58>138では-Wallで警告が消えているね。
>>139
コンパイラがっていうか、0で補うのが仕様ですが。
0143デフォルトの名無しさん
2008/08/14(木) 15:00:14されてるよ
全部のメンバに対して=0;と書いたように初期化されるから
浮動小数点数でもポインタでも正しく0.0やヌルポインタになる
0144デフォルトの名無しさん
2008/08/14(木) 15:04:55次の質問どーぞ
0145デフォルトの名無しさん
2008/08/14(木) 22:36:59この本ってどう?
0146デフォルトの名無しさん
2008/08/14(木) 22:41:47http://pc11.2ch.net/test/read.cgi/tech/1215510861/
ここで聞けばいいんじゃね
0147デフォルトの名無しさん
2008/08/15(金) 01:46:500148デフォルトの名無しさん
2008/08/15(金) 02:14:010149デフォルトの名無しさん
2008/08/15(金) 03:54:010150デフォルトの名無しさん
2008/08/15(金) 03:55:08コンパイラがあればできるんじゃね?
というかlinux上で動くwinコンパイラなんてあるの?
0151デフォルトの名無しさん
2008/08/15(金) 03:58:51機械語を生成するだけだからな
でも使った事はないし知らない
32bitPCで64bitや携帯の機械語が生成できるのと同じ
0152デフォルトの名無しさん
2008/08/15(金) 03:58:560153デフォルトの名無しさん
2008/08/15(金) 04:02:150154デフォルトの名無しさん
2008/08/15(金) 04:02:22とりあえず答えておくとmingwとか使えばできます
0155デフォルトの名無しさん
2008/08/15(金) 04:04:440156デフォルトの名無しさん
2008/08/15(金) 11:57:51unsigned char byte;
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} BYTE;
sizeof(BYTE)がどうしても1になってくれないんですけど、どうすりゃいいんでしょう?
0157デフォルトの名無しさん
2008/08/15(金) 12:05:14つーかbitをくくれよ
0158デフォルトの名無しさん
2008/08/15(金) 12:06:31で、これ1byteにできないの?
0159デフォルトの名無しさん
2008/08/15(金) 12:08:13unsigned char bitn:1;にすればよかったのね
0160デフォルトの名無しさん
2008/08/15(金) 12:08:48byte に対してビット演算しろよ
byte | 0x01
byte ^ 0x01
とかすればいいだけだろ?
0161デフォルトの名無しさん
2008/08/15(金) 12:50:010162デフォルトの名無しさん
2008/08/15(金) 12:52:20もうちっと最適化できないもんかね
0163デフォルトの名無しさん
2008/08/15(金) 12:56:010164デフォルトの名無しさん
2008/08/15(金) 12:57:290165デフォルトの名無しさん
2008/08/15(金) 12:57:57こういう風には書かないだろうなあというコードになる。
C言語の仕様なので我慢して使ってるけど。
0166デフォルトの名無しさん
2008/08/15(金) 13:00:22で、それに対する答えがそのまま>>162への答えだよ
0167デフォルトの名無しさん
2008/08/15(金) 13:02:150168デフォルトの名無しさん
2008/08/15(金) 13:10:523の倍数はいいとして
3のつく数の判定はどうすればいいんでしょう
0169デフォルトの名無しさん
2008/08/15(金) 13:15:270170デフォルトの名無しさん
2008/08/15(金) 13:18:34それ、私が新人研修で出した課題だw
sprintf()で文字列にしてから、strchr()で探すのが一番手っ取り早い。
真面目にやるなら、一桁ずつ10で割った余りをチェックすればいい。
0171168
2008/08/15(金) 13:39:07あまりを出して調べるやり方でやってみます。
ああ、でもそれだと32とか321は無理ですよね
一桁ずつというのは、
1、3を引く
2、10で割ってあまりが0か調べる
3、違うなら1へ
って感じですかね
ちなみに学校の宿題ですw
0172デフォルトの名無しさん
2008/08/15(金) 13:55:0212345%10 = 5
12345/10 = 1234
1234%10 = 4
1234/10 = 123
123%3 = さぇぁ〜ん!
0173デフォルトの名無しさん
2008/08/15(金) 13:55:370174デフォルトの名無しさん
2008/08/15(金) 13:56:41321 ÷ 10 = 32 … 1
32 ÷ 10 = 3 … 2
3 ÷ 10 = 0 … 3
余りに3が出たのでこの数字は3が含まれていると言う事がわかる
と言うこと
0175デフォルトの名無しさん
2008/08/15(金) 13:57:59そのやり方だと3の時に3を足さないと結果変わるね。
170の最後の行は
1 0かどうかチェック
2 %3の結果が0かどうかチェック
3 10で割った商と余りを別々に保存
4 余りが3かどうか
5 違うなら商を使って3へ
てことだろうから32でも321でも対応できるよ。
ただsprintf使った方がラク。
0176デフォルトの名無しさん
2008/08/15(金) 14:00:570177デフォルトの名無しさん
2008/08/15(金) 14:45:08return関数やscanfなどの標準入力関数を使うと、
なぜかprintfやmvaddstr関数などを飛ばしてしまい、ハイスコアの名前入力が作れません。
名前入力はどのようにすればいいでしょう?
メイン関数は下のようになってます
int main(int argc, char **argv){
int score;
char tmp[7];
initscr(); /* 画面の初期化 */
noecho(); /* エコーなし */
cbreak(); /* 一度に1文字入力をON */
keypad(stdscr,TRUE);; /* 矢印キーが使える */
if(LINES>MinY&&WCOLS>MinX){
window(); /* 画面描画 */
}
else{
printf("Windou size is too small!!!");
// return 0;
}
score = go(); /* ゲームを実行 */
GameEnd(score);
endwin(); /* ウィンドウ終了 */
return 0;
}
GameEnd関数では、mvaddstrで「GameOver」と出した後、
scoreの値とファイルの値を比較し、ハイスコアであれば
mvaddstrで「HighScore!put your name」と書いた後に
scanfで名前を受け取ろうとしたのですが、mvaddstrが抜かされてしまう感じです。
0178デフォルトの名無しさん
2008/08/15(金) 15:11:06scanwを使っちゃ駄目なのか?
0179デフォルトの名無しさん
2008/08/15(金) 15:16:080180デフォルトの名無しさん
2008/08/15(金) 15:19:280181デフォルトの名無しさん
2008/08/15(金) 15:21:17まずinitscrやらnoechoやらの仕様を詳細にチェックしなおすこと
モードを変えた後で元に戻さないとならないとかないか?
0182デフォルトの名無しさん
2008/08/15(金) 15:22:31# サイズが大きい場合は宿題スレのアップローダ等を利用してください
0183デフォルトの名無しさん
2008/08/15(金) 15:27:15>>178
使ってみましたが無視されてしまいました。
GameEndのソースファイルは今こんな感じです(いろいろ注釈にして試したりしてるのでごちゃごちゃしてますが…
endwin()を実行後に、注釈部のscanfなどをやってみてもだめでした・・・
void GameEnd(int score)
{
int i,j,k;
char tmp[7]=" ",file[10][7];
FileRead(file);
mvaddstr(LINES/2-2,WCOLS/2-5," GameOver!! ");
for(i=0;i<5;i++){
if(score>=atoi(file[1+2*i])){
for(j=4;j>i;j--){
strcpy(file[j*2], file[2*(j-1)]);
strcpy(file[2*j+1],file[2*j-1]);
}
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
mvscanw(LINES/2+1,COLS/2-15,tmp);
FileWrite(file);
break;
}
}
return;
}
0184デフォルトの名無しさん
2008/08/15(金) 15:36:34あとbreakはそこ一箇所だけでいいのか?
0185デフォルトの名無しさん
2008/08/15(金) 15:37:46すいません、ごちゃごちゃしてたので貼り忘れてました。
>>179
やってみましたがその部分になると凍結してしまいました…
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
fflush(stdout);
fflush(stdin);
scanf("%s",tmp);
こういう順番でやってみたのですが
>>181
やはりそうですよね… 学校の夏休み課題なんですが、cursesについての詳しい内容をほとんど教えられず
書き方だけしか教わってなかったのでさっぱりでした。
最悪カーセスモードを終了してからのscanfでやろうかと思ってるんですが、モードの終了の仕方もわからないで苦戦してます
0186184
2008/08/15(金) 15:37:54見間違えた
0187デフォルトの名無しさん
2008/08/15(金) 15:44:26cursesは標準出力じゃないから意味がない。
>fflush(stdin);
入力のフラッシュ動作は環境依存。
>scanf("%s",tmp);
%6sにしてバッファオーバフローを避けよう。
0188デフォルトの名無しさん
2008/08/15(金) 15:45:19fflush(stdin) は環境によっては segmentation fault になるんじゃなかったっけ?
curses で入力がある限り読み飛ばせば大丈夫そうな気はする
curses 使ったこと無いのでちゃんとかけないけど
こんな感じかと
while(キーボードバッファに何か残っている) 読み込む;
0189デフォルトの名無しさん
2008/08/15(金) 15:54:59ふむふむ。勉強になります
こんな感じに書き換えてみましたがどうしてもここで凍結してしまいます。
scanfをなくすだけでちゃんとmvaddstrの文が表示されて正常終了するのですが…
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
while(fgetc(stdin)!=EOF)
echo();
scanf("%6s",tmp);
0190デフォルトの名無しさん
2008/08/15(金) 15:59:25それは駄目だ
fgetc(stdin)==EOF になった時点以降は stdin から入力することはできない
dos (conio.h) でいうところの
while(kbhit()) getch();
っていうのがあるはず
0191デフォルトの名無しさん
2008/08/15(金) 16:02:47標準入力の端末動作で画面が崩れたりするからそもそも標準入力は使えないと思う。
0192デフォルトの名無しさん
2008/08/15(金) 16:05:28・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0193デフォルトの名無しさん
2008/08/15(金) 16:09:02getch()ですね、ラケット移動などのカーソル受付をそれでやってます。
ただ、kbhit()にあたる方が分かりません。
仕様では「ゲーム終了時にTOP5に入っていたら名前を入力してもらう」と書いてあったのであれなんですが
友達はウィンドウモードにする前に、一番最初に名前入れてもらってやったと言っていました。
最悪自分もそうしようかなと思っていますが、、何か腑に落ちない感じがします。
0194デフォルトの名無しさん
2008/08/15(金) 16:14:42while(getch() != '\r') 的な感じでどうだろうか?
0195デフォルトの名無しさん
2008/08/15(金) 16:17:45ググってみた
while(getch()!=ERR);
でよさげ
0196デフォルトの名無しさん
2008/08/15(金) 16:22:41なんと。
授業では入力方法は標準入力しか習ってないので…やはり一番最初に聞くしかない感じですかね
>>193
すいません初心者で。以後気をつけます
環境は学校の端末(ice環境)を外部環境(PodeRosa)で動かしてます。
>>194、195
行の左端に戻る…と。ERRも始めてみました。勉強になります
どちらも標準入力は受け付けなかったんですが、mvaddstrは表示されるようになりました!
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
while(getch()!=ERR);
echo();
scanf("%6s",tmp);
今はこんな感じです
0197デフォルトの名無しさん
2008/08/15(金) 16:26:100198デフォルトの名無しさん
2008/08/15(金) 16:32:20…が、出ませんでしたorz
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
while(getch()!=ERR);
echo();
mvscanw(LINES/2+2,COLS/2-22,tmp);
+------------------------------------------------------+
| |
| |Time 1
| #### #### #### #### #### #### #### |Level 1
| |Score 10
| GameOver!! |HighS
| #### #### #### #### #### #### |Name
| HighScore!!Put your name!!(Max 5 chars) |
| |
| |
| |
| |
| |
ssh{*********}262: |
0199デフォルトの名無しさん
2008/08/15(金) 16:43:00いろいろアドバイスくださってありがとうございます。勉強になりました。
とりあえずは期限もあとわずかなので仕様とは少しずれてしまいますが以下のソースで提出だけしておきます
ただ、自己満足になりますが悔しいのでいちおう現段階のソースも残しておきたいと思います。
int main(int argc, char **argv){
int score;
char tmp[7];
printf("Hello,put your Name!(Max 5 Chars)\n");
fgets(tmp,6,stdin);
printf("Let's play!!\n");
sleep(1);
initscr(); /* 画面の初期化 */ noecho(); /* エコーなし */
cbreak(); /* 一度に1文字入力をON */
keypad(stdscr,TRUE);; /* 矢印キーが使える */
if(LINES>MinY&&WCOLS>MinX){
window(); /* 画面描画 */
}
else{
printf("Windou size is too small!!!"); // return 0;
}
score = go(); /* ゲームを実行 */
GameEnd(score);
endwin(); /* ウィンドウ終了 */
return 0;
}
0200デフォルトの名無しさん
2008/08/15(金) 16:56:44つまり、fgets(tmp, sizeof(tmp), stdin)でいい。
それから、(文字数オーバーじゃない場合に)末尾に改行文字が残ることにも注意。
0201デフォルトの名無しさん
2008/08/15(金) 18:01:18win32プロジェクトでやってもエラーが出ました。
ちなみに拡張子を.cppでやるとコンパイルできます。
Cなんですけど。
0202デフォルトの名無しさん
2008/08/15(金) 18:05:30それが出るとき、プロジェクトのプロパティの全般の共通言語サポートはどうなってる?
0203デフォルトの名無しさん
2008/08/15(金) 18:15:29共通言語ランタイム サポートのことですよね。
共通言語ランタイム サポートを使用しないになってました。
0204デフォルトの名無しさん
2008/08/15(金) 18:23:13/clr のオプションがつくとCとしてはコンパイルできなくなる。
/clrをつけるのが、共通言語ランタイムサポート。
つまり、キミの状態はあきらかにおかしい。
同じ症状を持った人じゃないとわからんな。
0205デフォルトの名無しさん
2008/08/16(土) 09:52:030206デフォルトの名無しさん
2008/08/16(土) 10:59:01LSI C-86
0207デフォルトの名無しさん
2008/08/16(土) 12:23:44私はgcc(cygwin)を使っています。
0208デフォルトの名無しさん
2008/08/16(土) 14:34:520209デフォルトの名無しさん
2008/08/16(土) 14:42:31http://www.amazon.co.jp/dp/4938704269
この本に載ってるけど、見てみたらすごい値段になってるな。
0210デフォルトの名無しさん
2008/08/16(土) 15:20:02凄く・・・高いです。
どこかのサイトにCで書かれたサンプルコードは無いのでしょうか
0211デフォルトの名無しさん
2008/08/16(土) 17:11:22ほれ。つーか自分でぐぐれよ
まー俺もテキストはいじるので研究させもらうわ
0212デフォルトの名無しさん
2008/08/16(土) 17:26:47すまん、それは昨日見たんだが、
C++はどうも・・・
ありがとうございます。
0213デフォルトの名無しさん
2008/08/16(土) 17:59:15おいおい、100行ちょっとのソースも駄目なのかよw
0214デフォルトの名無しさん
2008/08/16(土) 19:20:380215デフォルトの名無しさん
2008/08/16(土) 19:25:22うん、駄目なのよ、C++分からないのよ
>>214
既に取り寄せ連絡したから問題無い
0216デフォルトの名無しさん
2008/08/16(土) 19:33:43ちなみにグーグルにはこんなのもあって
http://books.google.co.jp/bkshp?hl=ja&utm_source=ja-wh
0217デフォルトの名無しさん
2008/08/16(土) 19:41:10書籍だが、C++使える事前提で解説されてるの?
0218デフォルトの名無しさん
2008/08/16(土) 20:44:06死ぬほど丁寧に解説されててワロタ
あの解説文でわからないなら本読んでも無駄じゃない?
0219デフォルトの名無しさん
2008/08/16(土) 20:47:24イメージはファイルシステムの情報管理の方法だよ
0220デフォルトの名無しさん
2008/08/16(土) 21:08:410221デフォルトの名無しさん
2008/08/16(土) 21:16:13Cに書き直して下さい
0222デフォルトの名無しさん
2008/08/16(土) 21:21:46死ぬほど、とかそんな次元じゃなくて、
STL?template?operator?T& x?ってなんぞ?ってな感じでして、
C言語スレでC++のソースコード見せられるとは予想外でした。
C++じゃ全く読めなくて、すみません
0223デフォルトの名無しさん
2008/08/16(土) 21:23:28ギャップって呼ばれるのは特に説明がかかれてなかったけど1ギャップ=1バイトではなく
1ギャップ=nバイトの塊だよな?
0224デフォルトの名無しさん
2008/08/16(土) 21:25:02ソースは見ないで、下の解説文だけ読めばいいと思う
あれだけ丁寧に解説してあればサンプルソースなんかよりもずっと理解しやすいと思う
0225デフォルトの名無しさん
2008/08/16(土) 21:31:13図をみたら、nバイトとしか解釈しようがないと思うけど。
0226デフォルトの名無しさん
2008/08/16(土) 21:35:390227デフォルトの名無しさん
2008/08/16(土) 21:51:30かなり前にMicrosoft Visual C++ 2005 Express Editionってのを
やってみたんだけど、何をどうやっていかわからずいくつかくだらない
ソフトを作って終わってしまいました。
やってみたいことは、ブラウザなどの操作を自動でやらしたい。
メールを受信して、本文中にある一部が定型のアドレスを
抽出し指定時間ごとにブラウザで開きブラウザに定型の文が
表示されたらタブを閉じる。
アプリケーションを操作する。などです。
こんなことできますか?できるなら何の勉強が必要なのか
または近道なのか詳細お願いします。
0228デフォルトの名無しさん
2008/08/16(土) 21:59:39C#でやったほうがいいんじゃね?
ブラウザの操作は知らんけど、コンポーネントでIEの機能を使えるから、同様のことができると思う。
メールを受信してどうこうは、ググれば簡単に分かると思う。
0229デフォルトの名無しさん
2008/08/16(土) 22:00:02ネットワーク系かな
0230デフォルトの名無しさん
2008/08/16(土) 22:32:480231デフォルトの名無しさん
2008/08/16(土) 23:20:29すいません、上記サイトを眺めて勉強しているのですが、
C言語を業務で行うっていうレベルはどの程度なのでしょうか。
単に数の受け渡しをトレースできれば、
業務に就いたとき問題ないですか。
0232デフォルトの名無しさん
2008/08/16(土) 23:30:08そのリンク先の内容が理解できるなら、
業務に問題ないレベルだろうと思う。
>数の受け渡しをトレース
ってのはよく解らんのだけど。
0233デフォルトの名無しさん
2008/08/16(土) 23:32:240234デフォルトの名無しさん
2008/08/16(土) 23:37:46> 単に数の受け渡しをトレースできれば
データフローのことだと思うよ
データフローはプログラミングの基本、いやシステム設計の基本でもある
0235デフォルトの名無しさん
2008/08/16(土) 23:38:27ちょっと古くなってる部分もあるけど、C FAQくらいは目を通しておくとか。
http://www.kouno.jp/home/c_faq/
Cを使っている職業プログラマでもC FAQレベルに達してないのはいっぱいいるけど。
0236デフォルトの名無しさん
2008/08/16(土) 23:52:56ollyでもやってんのか?
0237デフォルトの名無しさん
2008/08/17(日) 00:49:53ありがとです。
引き続きサイトで勉強してみます。
0238デフォルトの名無しさん
2008/08/17(日) 01:30:09S-JIS->EUCとか
0239デフォルトの名無しさん
2008/08/17(日) 01:32:48使っている環境にあればの話
なければ自作
0240デフォルトの名無しさん
2008/08/17(日) 06:50:04本格的にc言語を勉強したいと思い下記のサイトをよんだりしていたのですが
やっぱり1から勉強するとしても情報が古すぎますか?
ttp://www9.plala.or.jp/sgwr-t/index.html
ttp://homepage3.nifty.com/mmgames/c_guide/
今まで子供の頃から端々でプログラムを書いて利用する事はあったのですが
例題の文章を適宜加工して使っていた程度です。
本格的にc言語を学ぶにはどのサイトを参考にするのが現在お勧めなのでしょうか?
そもそもビジュアルベーシックとか他の学ぶ方が現在では無難なんでしょうか?
0241デフォルトの名無しさん
2008/08/17(日) 07:36:51本格的にアセンブラやっても利用されるのはほんの一部なのと同じような物です。
C言語は生産効率が良くありません。
C++言語からにして、それで不足分があればC言語を勉強したほうがいいですよ
0242デフォルトの名無しさん
2008/08/17(日) 08:04:59音楽でいうところのピアノやクラッシックと同じで
基本として完全に把握しておけばその分将来有利だと考えたのですが・・・・
そもそもflashうまくなればcはむしろ必要ない言語なのでしょうか?
それでも基本は抑えておいた方が良いのかな?
オブジェクト指向プログラムしか扱えない人間はなにかしら欠点抱えるようにおもって勉強しようかと思ったのですが・・・・
苦しんで覚えるc言語でいうとどの程度までかじる価値があるのでしょうか?
それともオブジェクト指向メインでやるなら完全に必要ないとか・・・・・
0243デフォルトの名無しさん
2008/08/17(日) 08:16:20ピアノは演奏自体が大事ですが、プログラムは生産物が大事です。
コードに芸術性を求めても良くないです。
生産性はC++の方が上です。
オブジェクト指向は、プログラムを簡単にするやり方なだけで
C++だからといって必ずしも使う必要はありません。
0244デフォルトの名無しさん
2008/08/17(日) 08:23:01あと日本語を読み書きするのに文法の勉強が必ずしも必要ないように
動かして体験して動作が確認できればいいんです。
とくにC++(の実用面)で重要な点はSTLと思います。
http://www5c.biglobe.ne.jp/~ecb/index.html
http://www.geocities.jp/ky_webid/index.html
0245デフォルトの名無しさん
2008/08/17(日) 08:23:46基礎学力がないと、大作は作れないような気がするのですが
どうでしょうか?
0246デフォルトの名無しさん
2008/08/17(日) 08:29:30C言語も、C++言語も、結局はアセンブラに変換されるので、最も基本だと思います。
0247デフォルトの名無しさん
2008/08/17(日) 08:45:08アセンブラ+flashあたりが私にとっての理想の組み合わせなのかなぁ
とりあえずちょっと位さわりの部分程度は学んでc使える人と会話くらいはできるようになりたいので
苦しんで覚えるc言語をちょこっとやってみようとしたのですが問題が
ttp://hp.vector.co.jp/authors/VA017148/pages/cpad.html#cpaddownload
きときとCPadの一番重要なC/C++開発環境用だけが何故かリンク切れしてます。
どうすればこのエディタが手に入るでしょうか?
0248デフォルトの名無しさん
2008/08/17(日) 08:46:28もし私への質問でしたら、大作をつくる気はないです。
0249デフォルトの名無しさん
2008/08/17(日) 11:36:360250デフォルトの名無しさん
2008/08/17(日) 12:30:13Ruby の方が100倍難しいぞ
環境設定とか
環境設定とか
環境設定とか
0251デフォルトの名無しさん
2008/08/17(日) 12:36:11大作を作るためのノウハウを修得、熟練しましょう。
特に、C言語の取扱いだけに固執するのではなく、
上流工程と呼ばれるもの(要求分析と設計)も含めて学習を進めるといいでしょう。
ER図やDFDが書けるだけでも世界が変わってくるはずです。
0252デフォルトの名無しさん
2008/08/17(日) 12:52:10環境設定でなんか難しいところがあったっけ?
0253デフォルトの名無しさん
2008/08/17(日) 12:55:04素人はパス通す事も難しいんだ察してやれ
0254デフォルトの名無しさん
2008/08/17(日) 12:59:31ってことだろうなあ。
0255デフォルトの名無しさん
2008/08/17(日) 13:05:07まんどくさい
0256デフォルトの名無しさん
2008/08/17(日) 13:10:22コンソールで対話的にどうとかいう辺りで挫折しそうだけど
0257デフォルトの名無しさん
2008/08/17(日) 13:19:15オブジェクト指向なのか、構造体指向なのか
ハッキリわかりにくいんだよ
うんこRuby
しかもスレ違いじゃちんこ
0258デフォルトの名無しさん
2008/08/17(日) 13:47:050259デフォルトの名無しさん
2008/08/17(日) 13:49:160260デフォルトの名無しさん
2008/08/17(日) 13:52:120261デフォルトの名無しさん
2008/08/17(日) 16:28:12BMP画像を読み込む際に
画像にアルファチャンネルが含まれているかいないかの判断は
どうやってやるのでしょうか?
現在の自分のやり方ははヘッダから画像サイズと深度を計算して
ファイル総容量と比較しています。
あまりにもアレなやり方なので
他に方法があると思うのですが
ヘッダにもそれらしい情報もなく
皆さんはどのように判別されているのでしょうか?
よろしくお願いします。
0262デフォルトの名無しさん
2008/08/17(日) 16:30:20ヘッダにカラーフォーマットの情報なかったっけ?
0263デフォルトの名無しさん
2008/08/17(日) 16:33:000264デフォルトの名無しさん
2008/08/17(日) 16:34:09一応
32bitなんかだともたせれる
0265デフォルトの名無しさん
2008/08/17(日) 16:38:46ほれbmpフォーマットの解説
場所はあるけどリザーブ状態なんで既存のツールでは拾ってくれないかもね。
つーかPNG使え
0266デフォルトの名無しさん
2008/08/17(日) 17:00:32>>265
あ〜biBitCountって色深度じゃなくて1画素あたりの
RGBA総データサイズなんですね。
勘違いしてました。
ありがとうございますた!
おかげさまで
もう少しスマートにやれそうです。
0267デフォルトの名無しさん
2008/08/17(日) 21:38:280268デフォルトの名無しさん
2008/08/17(日) 22:22:57Cの世界だと、常にcharは1バイト。
ただ、1バイトが8bitとは限らない。
0269デフォルトの名無しさん
2008/08/17(日) 22:29:250270デフォルトの名無しさん
2008/08/17(日) 22:43:54現在稼働中で 1byte≠8bitな環境ってどんぐらい残ってんだろ?
0271デフォルトの名無しさん
2008/08/18(月) 02:35:30言葉など間違ってたらすみません。
0272デフォルトの名無しさん
2008/08/18(月) 02:44:24足し算や引き算だって遅くなるぞ
0273デフォルトの名無しさん
2008/08/18(月) 02:47:270274デフォルトの名無しさん
2008/08/18(月) 03:05:08最適化のこともあるので分かりません
0275デフォルトの名無しさん
2008/08/18(月) 06:56:05long hoge1=-101;
ulong hoge2=100;
printf("%d",(hoge1+hoge2));
とすると、「-1」が、
if( (hoge1 + hoge2)>0){printf("和が0以上\n")}
とすると、「和が0以上」と表示されました。
結果として、printfは正常、if文は異常な動作をしています。
if( (hoge1 + (long)hoge2)>0)・・・のように
if文中で使用している変数を型を揃えた場合、if文も正常に動作しました。
おそらく、if文中では変数の型を揃えないといけないものと勝手に理解しましたが、
これはC言語の仕様によるものでしょうか?
0276デフォルトの名無しさん
2008/08/18(月) 07:14:310277デフォルトの名無しさん
2008/08/18(月) 07:17:42%dはintに型変換されるから。
0278デフォルトの名無しさん
2008/08/18(月) 08:32:52printfでは実際の数値はわからない
フォーマット指定でいかようにも変わる
printf("%d",(hoge1+hoge2));
printf("%u",(hoge1+hoge2));
printf("%hu",(hoge1+hoge2));
0279デフォルトの名無しさん
2008/08/18(月) 09:37:22switch case はgccとかなら最適化で速くなるぜ。
使用しているコンパイラで色々試してみるのも一興
0280デフォルトの名無しさん
2008/08/18(月) 10:47:45入門レベルで気にするほどは変わりません。最適化で同じになる可能性もあることは既に指摘の通り。
0281デフォルトの名無しさん
2008/08/18(月) 15:37:11もっとクールでスパーハッカー的なやりかたってある?
a = (int **) malloc(sizeof(int *)*A);
for(i = 0; i < A; i++) a[i] = (int *) malloc(sizeof(int)*B);
0282デフォルトの名無しさん
2008/08/18(月) 15:40:44http://pc11.2ch.net/test/read.cgi/tech/1217123234/133/
0283デフォルトの名無しさん
2008/08/18(月) 15:43:12半分動的だけど、半分静的じゃん
0284デフォルトの名無しさん
2008/08/18(月) 15:44:53AもBもコンパイル時には確定しない値(変数)にしたいなら、簡便法はない。
0285デフォルトの名無しさん
2008/08/18(月) 15:46:33C99に足をつっこむという簡単な方法が!
0286デフォルトの名無しさん
2008/08/18(月) 15:51:29要求する領域全体が、メモリ上に連続で確保できる程度の大きさなら、
一遍に割り付けたほうがmallocのコストが低い。
a = (int **) malloc(sizeof(int *)*A);
a[0] = (int *) malloc(sizeof(int)*A*B);
for(i = 1; i < A; i++) a[i] = a[i-1] + B;
もちろんどっちがいいかは場合による。
0287デフォルトの名無しさん
2008/08/18(月) 15:53:16志村、その論点ならmallocもう1個減らせるよ
0288デフォルトの名無しさん
2008/08/18(月) 16:14:260289デフォルトの名無しさん
2008/08/18(月) 18:22:32<ncurses.h>のprintwを使って全角文字を表示しようと文字化けします。
同じ書式で標準出力でprintfを使った場合は、全角文字が表示されているので、
端末などの設定は正しいと思います。
リアルタイムでキー入力を受け付けるgetch()が使いたいので、ncursesは必要です。
解決方法ないでしょうか。
0290デフォルトの名無しさん
2008/08/18(月) 18:48:10エディタぽいのつくってるのかな。
全角に半角上書き処理してるんじゃないかとエスパー。
0291289
2008/08/18(月) 18:56:28#include <ncurses.h>
#include <locale.h>
int main(void){
setlocale(LC_ALL,"");
initscr();
printw("ほげほげ");
refresh();
usleep(1000000);
endwin();
}
ここまで短くしても文字化けしてしまいます。
0292デフォルトの名無しさん
2008/08/18(月) 19:48:33a = (int **) malloc(sizeof(int)*A*B);
for(i = 1; i < 20; i++) a[i] = a[i-1] + B;
つまりこういうこと?
こっちのほうがfreeも一回でいいから便利そうだね�d!
0293デフォルトの名無しさん
2008/08/18(月) 19:58:22それは明らかにおかしい。
0294デフォルトの名無しさん
2008/08/18(月) 20:06:05malloc(sizeof(int)*A*B + sizeof(int*)*A);
って事かな
0295デフォルトの名無しさん
2008/08/18(月) 20:12:23a = (int **)malloc(sizeof(int *)*A);
for(int i = 0; i < A; i++)
a[i] = (int *)malloc(sizeof(int)*A);
0296デフォルトの名無しさん
2008/08/18(月) 20:41:11for(i = 0; i < A; i++) a[i] = (int *)a + A + i * B;
〜
free(a);
なんどもサーセン
これで正解じゃなかったらあきらめる
0297デフォルトの名無しさん
2008/08/18(月) 21:24:010298デフォルトの名無しさん
2008/08/18(月) 21:36:32現在、system関数で一行に複数のコマンドを打つ必要に迫られているのですが…ウィンドウズのプロンプトでの命令の区切文字ってあるのでしょうか?
unix系だと「;」だったんですが、ウィンドウズの場合は一行一命令という絶望的な解説しか見当たりません。
一応「;」「,」「:」等を試してみましたがダメでした。
知っている方がいらしたら、よろしくお願いします。
0299デフォルトの名無しさん
2008/08/18(月) 21:40:180300デフォルトの名無しさん
2008/08/18(月) 21:48:440301デフォルトの名無しさん
2008/08/18(月) 21:51:110302ym
2008/08/18(月) 22:02:21正常終了値;0 異常終了値;−1で判定するプログラムを誰か教えてください。
お願いします。
0303デフォルトの名無しさん
2008/08/18(月) 22:05:12だから無難に
a = (int **)malloc(sizeof(int *)*A);
for(int i = 0; i < A; i++)
a[i] = (int *)malloc(sizeof(int)*B);
てして
for(int i = 0; i < A; i++)
free(a[i]);
free(a);
ってすればいいじゃん
0304デフォルトの名無しさん
2008/08/18(月) 22:12:56#include <ctype.h>
int CheckFunc(char *str)
{
int i;
int check;
for(i = 0; str[i]; i++){
if((check = isalpha(str[i])) == 0)
return -1;
}
return 0;
}
0305デフォルトの名無しさん
2008/08/18(月) 22:13:29NT系限定だけどこれはだめか?
cmd.exe /c hoge & foo
0306デフォルトの名無しさん
2008/08/18(月) 22:21:05static int
checkstrA_Z(const char *str);
int
main(int argc, char *argv[])
{
if ( argc < 1 ) {
return -1;
}
return checkstrA_Z(argv[1])
}
static int
checkstrA_Z(const char *str)
{
for ( ; *str; str++ ) {
if ( !(('A' <= *str) || (*str <= 'Z')) ) {
return -1;
}
}
return 0;
}
/* EOF */
適当に作った、遅かったか。しかも試してないのでサーセン。
0307304
2008/08/18(月) 22:36:29>>302
#include <ctype.h>
int CheckFunc(char *str)
{
int i;
int check;
for(i = 0; str[i]; i++){
if((check = isupper(str[i])) == 0)
return -1;
}
return 0;
}
0308デフォルトの名無しさん
2008/08/18(月) 22:38:49なんで素直に
{
while(*str++){
if (('A' > *str) || (*str > 'Z')) {
return -1;
}
return 0;
}
としない?
無意味に複雑にするから案の定、バグってるじゃん。
0309298
2008/08/18(月) 22:40:55できました!!
すれ違いな質問なのに、答えていただきありがとうございました!
他の皆さんにもご迷惑をお掛けしてすみませんでしたm(_ _)m
ほいでは。
0310308
2008/08/18(月) 22:41:560311デフォルトの名無しさん
2008/08/18(月) 22:44:550312デフォルトの名無しさん
2008/08/18(月) 22:51:400313デフォルトの名無しさん
2008/08/18(月) 22:55:52return *str == '\0' ? 0 : -1;
0314デフォルトの名無しさん
2008/08/18(月) 23:02:28一般的に言って、短いほうが間違いがおきにくい。
複数の処理を一箇所にまとめて書くことはソースを縦に縮める効果がある。
一方で大抵の場合は同時に横に広がることでもあるので、
どちらを選ぶかはバランス感覚と好みの問題。
どっちがいいとか悪いとかいうことは、ない。
0315デフォルトの名無しさん
2008/08/18(月) 23:10:32と、どこかで見た記憶があるけど忘れた
0316デフォルトの名無しさん
2008/08/18(月) 23:12:410317デフォルトの名無しさん
2008/08/18(月) 23:12:570318デフォルトの名無しさん
2008/08/18(月) 23:14:240319デフォルトの名無しさん
2008/08/18(月) 23:17:160320デフォルトの名無しさん
2008/08/18(月) 23:19:350321デフォルトの名無しさん
2008/08/18(月) 23:19:550322デフォルトの名無しさん
2008/08/18(月) 23:20:190323デフォルトの名無しさん
2008/08/18(月) 23:21:11ロートルですか?
0324デフォルトの名無しさん
2008/08/18(月) 23:23:22他にソースの長さを測る単位教えて若い人。
0325デフォルトの名無しさん
2008/08/18(月) 23:24:150326デフォルトの名無しさん
2008/08/18(月) 23:24:500327デフォルトの名無しさん
2008/08/18(月) 23:25:540328デフォルトの名無しさん
2008/08/18(月) 23:27:380329デフォルトの名無しさん
2008/08/18(月) 23:29:330330デフォルトの名無しさん
2008/08/18(月) 23:30:23同じ仕事をやる100行のソースAと1000行のソースBで偉いのはどっち?
0331デフォルトの名無しさん
2008/08/18(月) 23:31:06だから、>>329
0332デフォルトの名無しさん
2008/08/18(月) 23:34:17ということは、長くだらだらと書く奴の方が簡潔に書く奴より高給を貰ってた訳か
狂ってるな
0333デフォルトの名無しさん
2008/08/18(月) 23:34:180334デフォルトの名無しさん
2008/08/18(月) 23:35:49正直者はいつも馬鹿を見るのがこの世です
0335デフォルトの名無しさん
2008/08/18(月) 23:36:21まー実際は予算も決まってるし、新規で行数書けばその分テスト件数も増やさないといけないとか
いろいろあるのよ>日立の場合。
0336デフォルトの名無しさん
2008/08/18(月) 23:44:00n = strspn(s, "ABCDEF・・・XYZ");
if (s[n] == '\0') return 0;
else return -1;
とすれば、ループもなくなるなと一瞬思ったけど、やっぱ"ABCDEF・・・"と書くのがダサいな。
isupperでまわしたほうがいいか。
あと、正常が0で、異常終了で-1ってのも、出題者のセンスが・・・
0337デフォルトの名無しさん
2008/08/18(月) 23:45:35つか、メインフレームの作業体制は極度に分業が進んでいて
コーダーという人は詳細フローを言語のコードに一行ずつ落とすだけ。
そういう環境だから、ステップ単価というのは有効だったんだよ
0338デフォルトの名無しさん
2008/08/18(月) 23:49:20正常0は理にかなってるよ
正常は一通りしかないが、異常にはいろんなケースがある
だから正常は0を返し、エラー時はエラーコードを返すほうがいい
0339デフォルトの名無しさん
2008/08/18(月) 23:53:14だからウゼーって
独り言はチラシの裏にでも書いてろ
0340デフォルトの名無しさん
2008/08/18(月) 23:54:30この場合は、エラーは一通りしかないじゃん。
bool値のかわりで、0と0以外のほうがいい。
それに、そういう思想だったら、-1じゃなくて、0とマイナス値としておかないとダメ。
0341デフォルトの名無しさん
2008/08/18(月) 23:56:05きっとそうだよ
0342デフォルトの名無しさん
2008/08/18(月) 23:58:21完全に反論の余地がない時は黙ってた方がいいですよ
0343デフォルトの名無しさん
2008/08/18(月) 23:59:580344デフォルトの名無しさん
2008/08/19(火) 00:00:110345デフォルトの名無しさん
2008/08/19(火) 00:04:42ああ、そういえば再帰とかつかって、面白い回答にするの忘れてたな。
0346デフォルトの名無しさん
2008/08/19(火) 00:05:540347デフォルトの名無しさん
2008/08/19(火) 00:12:35標準ライブラリ関数を使うことの何が問題なんだかわからん
string.hに定義されてるような車輪の再発明をやらせる方がよっぽど問題だ
0348デフォルトの名無しさん
2008/08/19(火) 00:13:05反論の余地とかそういう問題じゃなくてお前がうざいの
0349デフォルトの名無しさん
2008/08/19(火) 00:14:15しーっ!これ以上書くと頭が悪いことがばれますよ!
0350デフォルトの名無しさん
2008/08/19(火) 00:15:18繋がる気がするから再発明も完全に無駄だとは思わない俺
0351デフォルトの名無しさん
2008/08/19(火) 00:16:290352デフォルトの名無しさん
2008/08/19(火) 00:16:34お前がな
0353304
2008/08/19(火) 00:22:21じゃ初学者用に書くよ
int CheckFunc(char *str)
{
int i;
for(i = 0; str[i]; i++){
if ('A' > str[i] || str[i] > 'Z')
return -1;
}
return 0;
}
>>344
0が返る
0354デフォルトの名無しさん
2008/08/19(火) 00:25:07○strがNULLだと落ちる
○iは無くても書ける
0355デフォルトの名無しさん
2008/08/19(火) 00:26:590356デフォルトの名無しさん
2008/08/19(火) 00:27:27しーっ!これ以上書くと頭が悪いことがばれますよ!
0357デフォルトの名無しさん
2008/08/19(火) 00:28:01引数にNULLを渡してはいけないという仕様です。
0358デフォルトの名無しさん
2008/08/19(火) 00:29:430359デフォルトの名無しさん
2008/08/19(火) 00:29:59君の世界ではそれでいいのかもしれないが、俺の世界では文字列のNULLチェックを怠ったばかりに
落ちてしまうソフトが後を絶たないんだなこれが
0360デフォルトの名無しさん
2008/08/19(火) 00:32:540361デフォルトの名無しさん
2008/08/19(火) 00:43:45あなたの世界では、たとえばstrcat()にNULLを渡したときに、落ちずに正常に動作してますか?
strcat()がNULLを渡しても動作するとしたら、どう動作すればいいですか?
0362デフォルトの名無しさん
2008/08/19(火) 01:04:200363デフォルトの名無しさん
2008/08/19(火) 01:14:150364デフォルトの名無しさん
2008/08/19(火) 02:40:04顔が真っ赤ですよ
0365デフォルトの名無しさん
2008/08/19(火) 03:04:33しーっ!これ以上書くと頭が悪いことがばれますよ!
ってもう遅いけど
0366デフォルトの名無しさん
2008/08/19(火) 04:02:45無効なポインタは別にNULLだけじゃないから、無効なポインタは渡す側の責任でしか回避できない。
もちろん渡された側でのNULLチェックで回避できる問題もある。
でも渡される側でNULLチェックを怠ったばかりにおちてしまうような関数の使い方をしているようなプロジェクトなら、
他にも無効なポインタを渡してしまうような潜在的な危険があったりするおそれも。
>>357の人も引数に渡してはいけないのはNULLとせず、無効なポインタとすべきだったと思う。
0367デフォルトの名無しさん
2008/08/19(火) 09:43:53まあassert入れといてもバチはあたらんと思うが。
0368デフォルトの名無しさん
2008/08/19(火) 11:44:22sprintf_sは、Visual Studioの独自の関数で、2番目に、文字列のサイズを引数に取ります
マクロとかで解決できないでしょうか
0369デフォルトの名無しさん
2008/08/19(火) 11:46:230370デフォルトの名無しさん
2008/08/19(火) 11:50:42ありがとうございます。まさにそれを探してました。
0371デフォルトの名無しさん
2008/08/19(火) 12:30:24#ifdef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
#undef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
#endif
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
int main( void )
{
char fname[256];
// this causes 4996 warning
sprintf( fname, "%s", "hogehoge" );
// this is safe version
// sprintf_s( fname, sizeof(fname), "%s", "hogehoge" );
return true;
}
こんなシンプルなものでもまだwarningでるんですが。。。
0372デフォルトの名無しさん
2008/08/19(火) 12:32:15というかMSDN嫁
0373デフォルトの名無しさん
2008/08/19(火) 12:32:37#include <stdio.h>を後にしたらできました。
0374デフォルトの名無しさん
2008/08/19(火) 12:34:47>>372は関係ないわ
#pragma warning(disable : 4996)
0375デフォルトの名無しさん
2008/08/19(火) 12:35:56どうもありがとうございます。
MSDNは嫁にしたんですが、気づきませんでした。
0376デフォルトの名無しさん
2008/08/19(火) 12:41:29それとNetbeansでCをやろうとするとコンパイラが見つからないとエラー吐くんですが、
コンパイラってどこからDLするんでしょうか?
両方ググってはみたものの分かりませんでしたのでお願いします。
0377デフォルトの名無しさん
2008/08/19(火) 12:42:370378デフォルトの名無しさん
2008/08/19(火) 12:56:190379デフォルトの名無しさん
2008/08/19(火) 13:00:12ヘッダの位置変えたらうまくいくんでしょ?
コンパイラだって機械だからねえ。
機械的、要するにソースの上から解釈するってことだけでしょ。
0380デフォルトの名無しさん
2008/08/19(火) 13:06:01関数がソースに前に来るとか理解できてるんだろうか?
0381デフォルトの名無しさん
2008/08/19(火) 13:12:34そのとおりです。ヘッダをトップに持ってきたらうまくいきました。
>>380
理解できているつもりが、宣言の順番を変えるとうまくいかなくなる説明が解釈できません。
0382デフォルトの名無しさん
2008/08/19(火) 13:21:26コンパイラの仕組み勉強してこい。
0383デフォルトの名無しさん
2008/08/19(火) 13:25:32的確なアドバイス、どうもありがとうございます。
不毛な気がしますが、VCのコンパイラがどのタイミングでCRTライブラリにしてくれるのか、調べてみます。
0384デフォルトの名無しさん
2008/08/19(火) 13:30:49後でスイッチ置かれても切り替えができなってことかな?
0385デフォルトの名無しさん
2008/08/19(火) 13:52:310386デフォルトの名無しさん
2008/08/19(火) 13:53:35_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
こっちな
0387デフォルトの名無しさん
2008/08/19(火) 13:59:33切り替えたいときはincludeの前に置くのは常識なんだけどな。
コンパイラ等に指示出せるのはpragma
0388デフォルトの名無しさん
2008/08/19(火) 14:23:050389デフォルトの名無しさん
2008/08/19(火) 14:28:150390デフォルトの名無しさん
2008/08/19(火) 14:33:19「C言語プログラミング能力認定試験」という、クソの役にも立たない資格があるぞ。
3級とか、C言語をほとんど知らなくても取れる。2級はプログラムが組めなくても取れる。
が、入門レベルがわかるだけの資格持ってて何の役にたつと思う? やめとけ。
0391デフォルトの名無しさん
2008/08/19(火) 15:30:31なるほど。みなさん、よくわかりました。
おそらく、
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESがデフォルトでゼロになっていて、その値をマクロの引数にとって何かを展開しているのでだめなんでしょうね。
先手を取って1で定義してあげればよい、と。
#undefの使い方の間違えの典型であることがわかりました。
以上踏まえて、既に定義されているマクロを再定義する場合は#undefを使わないで、そのマクロが定義されている#includeの前におけばよいってことですかね。
0392デフォルトの名無しさん
2008/08/19(火) 15:50:55そこから頑張って2種とか取れば良い。
ていうか、会社に理解してもらえない資格は時間の無駄、金の無駄。
CG検定、シスアドとか取ったけど糞の役にもたたねぇ。
0393ym
2008/08/19(火) 16:06:37#include <ctype.h>
#define RET_OK 0
#define RET_NG -1
int N60901D01(const char *psChkString
{
int i;
for(i = 0;psChkString[i]!='\0';i++){
if(isupper(psChkString[i])!=0){
return RET_OK;
} else{
return RET_NG;
}
}
return RET_OK;
}
int main(void)
{
char str[256];
int chk;
gets(str);
chk = N60901D01(str);
printf("\n戻り値は%dです\n",chk);
}
アルファベットをチェックするプログラムなんですけど、
コンパイルをしたら1文字分しかチェックされませんでした。
どこが間違っているか教えてください。
お願いします。
0394デフォルトの名無しさん
2008/08/19(火) 16:09:22>if(isupper(psChkString[i])!=0){
の中で必ず一回目でreturnしてる。
0395デフォルトの名無しさん
2008/08/19(火) 16:11:53for文の中で1文字目チェックした後、真でも偽でもreturnしてるだろう。
そこは最後まで回さないと。最後がRET_OKってことは、if文のRET_OKの行を消せばいいような気がする。
0396ym
2008/08/19(火) 16:11:550397デフォルトの名無しさん
2008/08/19(火) 16:16:59>>395の言うように、
if(isupper(psChkString[i])!=0){
の下の
return RET_OK;
を消してみ。
0398デフォルトの名無しさん
2008/08/19(火) 16:17:120399ym
2008/08/19(火) 16:26:09ありがとうございました。
0400デフォルトの名無しさん
2008/08/19(火) 16:37:480401デフォルトの名無しさん
2008/08/19(火) 16:43:413つめのreturn文にいくことはありませんエラーか。
0402デフォルトの名無しさん
2008/08/19(火) 17:43:19#include <stdio.h>
#import <time.h>
#include <unistd.h>
int main (int argc, const char * argv[]) {
clock_t start, end;
start = clock();
printf("start:%ld¥n",start);
sleep(1);
end = clock();
printf("end:%ld¥n",end);
printf("CLOCKS_PER_SEC:%ld¥n",CLOCKS_PER_SEC);
printf("%ld秒経過しました。¥n", (end - start) / CLOCKS_PER_SEC);
return 0;
}
これを実行すると
start:6464
end:6580
CLOCKS_PER_SEC:1000000
0秒経過しました。
こんな結果が帰ってきました。
CLOCKS_PER_SECは1秒あたりのクロック数では無いのでしょうか。
0403デフォルトの名無しさん
2008/08/19(火) 17:46:260404デフォルトの名無しさん
2008/08/19(火) 17:49:150405デフォルトの名無しさん
2008/08/19(火) 17:52:29ありがとうございます。
start:6894
end:7011
CLOCKS_PER_SEC:1000000
0.000117秒経過しました。
こうなりました。sleep(1)が0.00017秒?なわけ無いんだが…
CLOCKS_PER_SECはあてにならないってことなのかな
0406デフォルトの名無しさん
2008/08/19(火) 17:55:171秒単位とか精度が悪すぎる(この場合はな)
0407デフォルトの名無しさん
2008/08/19(火) 17:55:40int b[4];
int c[4];
:
:
といった感じに、int型配列が大量に存在している場合に、配列内の数字でソートしたいのですが、
int型配列の数字の大小比較がうまくできません。どなたかご教授お願いします
単純に int(a[0] > b[0]){ってやっていくと死ねる・・・orz
0408デフォルトの名無しさん
2008/08/19(火) 18:00:090409デフォルトの名無しさん
2008/08/19(火) 18:01:15Winの独自実装ですか…
残念ながらWindowsでは無いです
0410デフォルトの名無しさん
2008/08/19(火) 18:04:02どんな環境でやってるの?
0411デフォルトの名無しさん
2008/08/19(火) 18:06:110412デフォルトの名無しさん
2008/08/19(火) 18:07:190413デフォルトの名無しさん
2008/08/19(火) 18:07:50だろーね
こういうやり方してもテストにならないってこった
0414デフォルトの名無しさん
2008/08/19(火) 18:08:41printf挟んどいてそれはないだろ
0415402
2008/08/19(火) 18:11:16gcc 4.0.1
Mac OS 10.5.4
Intel Core Duo 2.4GHz
2GB 667MHz DDR2 SDRAM
です。
0417デフォルトの名無しさん
2008/08/19(火) 18:20:39何がしたいのかよくわからないが、たぶん配列を大量に作るのがもうおかしいんだろう。
ソートしたいもの全部を一つの配列に入れましょう。
0418デフォルトの名無しさん
2008/08/19(火) 18:25:55はもうちょっとくやしく
0419デフォルトの名無しさん
2008/08/19(火) 18:32:50int a[4] ; a[0] =1 a[1]=2 a[2]= 3 a[3]= 4
int b[4] ; b[0] =2 b[1]=2 b[2]= 3 b[3]= 4
として、a自体を1234、bを2234と考えて、大小比較を行いたいわけなんです
この場合はb>aみたいな感じで・・・
0420デフォルトの名無しさん
2008/08/19(火) 18:34:33配列で連続してればcharで見てやって
0421デフォルトの名無しさん
2008/08/19(火) 18:38:18if ((a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]) < (b[0] * 1000 + b[1] * 100 + b[2] * 10 + b[3])) {
// bが大きい
} else {
// aが大きい
}
とかじゃ駄目なの?
0422デフォルトの名無しさん
2008/08/19(火) 18:38:42今調べてみましたが
buf1 と buf2 を先頭から n バイト分比較します。比較はunsigned char として行われます
とあるのですが、int型でも関係なくできるものなんですか?
intとcharじゃバイト数が全然違うので、なんか変なことになりそうな気もするのですが・・・
0423デフォルトの名無しさん
2008/08/19(火) 18:39:43配列が何個もあるんです・・・
んで、バブルソートみたいなことをやりたいので、そのように書くととんでもないことになるんですorz
関数として何か簡単に比較できるものがないかな〜という感じで探してたのですが、いいのがなくて('A`
0424デフォルトの名無しさん
2008/08/19(火) 18:40:28同じCPU環境化でメモリに入れちゃえばcharだろうがなんだろうがw
長ささえ同じなら問題ないよ。
エンディアンの問題も関係ないし。
0425デフォルトの名無しさん
2008/08/19(火) 18:41:45それなら1桁目からソートしていけば良さそうだけど。
0426デフォルトの名無しさん
2008/08/19(火) 18:43:56なるほど・・・。ためしにちょいと動かしてみます〜
0427デフォルトの名無しさん
2008/08/19(火) 18:46:24int i = 0,c = 0;
while(!(b[i]-a[i]) && c < 3)i++, c++;
if(b[i]-a[i]==0)puts("同じ");
else if(b[i]-a[i]>0) puts("bのがおおきい");
else puts("aのがおおきい");
0428デフォルトの名無しさん
2008/08/19(火) 18:52:21のサンプルでいけば
ビッグエンディアン系だとメモリに格納された場合はこんな感じ
a 00000001 00000002 00000003 00000004
b 00000002 00000002 00000003 00000004
で格納する元も両方intで比べる際もcharでもいいしunsigned charでもいいし両者の条件さえ同じなら比較する桁もあうので問題ない
リトルエンディアン系でも同じ
ビッグエンディアン系だとメモリに格納された場合はこんな感じ
a 01000000 02000000 03000000 04000000
b 02000000 02000000 03000000 04000000
intをレジスタ上で扱う場合は�@�A�B�C(<-バイトの並びね)だったらメモリには�C�B�A�@とアドレスの最初から格納されるけど
通信でほかに渡したしりなければ同じエンディアン系で処理されるので結果memcmpであろうが比較する桁はいっしょなので
問題ない
0429デフォルトの名無しさん
2008/08/19(火) 18:53:300430こうならないの?
2008/08/19(火) 18:57:27a 00000F01 00000002 00000003 00000004
b 00000002 00000002 00000003 00000004
(a > b)
リトルエンディアン
a 010F0000 02000000 03000000 04000000
b 02000000 02000000 03000000 04000000
(b < a)
0431デフォルトの名無しさん
2008/08/19(火) 18:59:010432デフォルトの名無しさん
2008/08/19(火) 18:59:11エンディアン系を意識すればいいだけだろw
0433デフォルトの名無しさん
2008/08/19(火) 19:02:00memcmpが意識してくれるの?
0434デフォルトの名無しさん
2008/08/19(火) 19:04:58大きいか小さいかイコールでくれるんだろw
そんなことも考えれないようなら素直にループで1つ1つやれw
0435デフォルトの名無しさん
2008/08/19(火) 19:17:40こういうのは?
リトルエンディアン
a 01010000 02000000 03000000 04000000
b 00020000 02000000 03000000 04000000
memcmpの結果 (a > b)
リトルエンディアン
a 00010000 02000000 03000000 04000000
b 00020000 02000000 03000000 04000000
memcmpの結果 (b < a)
でも実際は、どちらも b > a にならなければおかしい
0436デフォルトの名無しさん
2008/08/19(火) 19:36:170437デフォルトの名無しさん
2008/08/19(火) 19:42:35数字があるとするじゃん。
一番上の位から読む?(ビッグエンディアン)
それとも一番下の位から読む?(リトルエンディアン)
って話。
0438デフォルトの名無しさん
2008/08/19(火) 19:44:20いやそれは違う・・・
メモリ上に複数バイトで構成される数字を格納した際の
格納のされ方の違いだよ。
0439デフォルトの名無しさん
2008/08/19(火) 19:50:020440デフォルトの名無しさん
2008/08/19(火) 20:45:12汚ぇなぁ、おい。
>>435
>431
>>416
unix系なら、gettimeofday()がそこそこ使える。こいつは実時間だ。
既に指摘の通り、clock()はCPU時間だから要注意だ。
0441デフォルトの名無しさん
2008/08/19(火) 21:00:10比較する関数を作ればいいだけなんじゃないの?
エンディアンを意識してどうこうするよりよほど楽だと思うんだけど
0442デフォルトの名無しさん
2008/08/19(火) 21:06:39こんなんとか
int cmp(int a[4], int b[4]){
int i, ret;
for(i=0;i<4;i++){
ret=a[i]-b[i];
if(ret) break;
}
return ret;
}
0443デフォルトの名無しさん
2008/08/19(火) 21:38:42卵を大きい方の端から割る派閥(ビッグエンディアン)と、
卵を小さい方の端から割る派閥(リトルエンディアン)とに分かれて
争っていたんだそうな(とある国の政治家の風刺でもあるんだが)。
それにちなんで、MSBから先に格納するのをビッグエンディアン、
LSBから先に格納するのをリトルエンディアンと呼ぶんじゃよ。
0444デフォルトの名無しさん
2008/08/19(火) 21:46:400445デフォルトの名無しさん
2008/08/19(火) 21:48:340446デフォルトの名無しさん
2008/08/19(火) 21:50:30標準Cの範囲内では無理じゃないかな?
0447デフォルトの名無しさん
2008/08/19(火) 22:11:52ちょw
条件後付
0449デフォルトの名無しさん
2008/08/19(火) 22:53:170450デフォルトの名無しさん
2008/08/19(火) 23:01:45できるよ。
符号付きとなしとで微妙に変わるけど、加減算なら二つの数値の
最上位ビット見ればいい。
乗除算もちょっと手間かかるけどできなくはない。
0451デフォルトの名無しさん
2008/08/19(火) 23:09:23加算でもいいから教えてくだちい
0452デフォルトの名無しさん
2008/08/19(火) 23:16:07負と負なら答えは負なので最上位ビットは普通はずっと1、 オーバー フローすると0になる
負と正ならそもそもオーバーフローしない
正と正ならオーバーフローすると最上位は1になる
そんな感じ
0453デフォルトの名無しさん
2008/08/19(火) 23:17:01加算なら結果からもう一回引いてみればいいんじゃね?
元の数字に復元できれば桁あふれ無し。
元の数字にもどら無ければ桁あふれあり
0454デフォルトの名無しさん
2008/08/19(火) 23:26:06・・・アンダーフローって意味違うような気がした
0455デフォルトの名無しさん
2008/08/19(火) 23:27:450456デフォルトの名無しさん
2008/08/19(火) 23:31:35お戯れを。
0457デフォルトの名無しさん
2008/08/19(火) 23:33:350458デフォルトの名無しさん
2008/08/19(火) 23:38:170459デフォルトの名無しさん
2008/08/19(火) 23:39:47足りなくなったら隣の人の借りろ
マイナスなど知らん
0460デフォルトの名無しさん
2008/08/19(火) 23:44:17そもそも、どんなデータなんだよ。
そのオーバーフローやアンダーフローを気にしなくてはいけないデータというのは。
0461デフォルトの名無しさん
2008/08/19(火) 23:51:07int chk_type, result, is_over_flow=0;
chk_type=(a<0)*2+(b<0);
result=a+b;
switch(chk_type){
case 0: if(result>0) is_over_flow=1; break; // a, b ともに 0 以上なので解も 0 以上になるべき
case 3: if(result<0) is_over_flow=1; break; // a, b ともに 0 未満なので解も 0 未満になるべき
}
if(p_is_over_flow) *p_is_over_flow=is_over_flow;
return result;
}
0462デフォルトの名無しさん
2008/08/19(火) 23:52:000463デフォルトの名無しさん
2008/08/20(水) 01:01:39ちょっとした計算を代わりにやってもらうのプログラムなんですが
計算過程を式としては理解しているのですが、
計算途中の値がどの程度の大きさになっているのは知りません
知らないうちにオーバーフローしてるんじゃないかと少し不安なんです
もちろん値が狂ったら答えも大抵はおかしくなるでしょうからそうそう困ることはないのですが
0464デフォルトの名無しさん
2008/08/20(水) 01:04:47方程式の解とかで元の式に代入して検算とかできるのなら困らないけど
0465デフォルトの名無しさん
2008/08/20(水) 01:37:58int add(int a, int b, int *p_is_overflow){
int chk_type, result, is_overflow=0;
chk_type=(a<0)*2+(b<0);
result=a+b;
switch(chk_type){
case 0: if(result<0) is_overflow=1; break; // a, b ともに 0 以上なので解も 0 以上になるべき
case 3: if(result>=0) is_overflow=1; break; // a, b ともに 0 未満なので解も 0 未満になるべき
}
if(p_is_overflow) *p_is_overflow=is_overflow;
return result;
}
掛け算は a*b/b==a をチェックすればいい
整数同士の除算は一つの例外を除いてオーバーフローしない (0div はあるけど)
0466デフォルトの名無しさん
2008/08/20(水) 01:57:370467デフォルトの名無しさん
2008/08/20(水) 02:00:180468デフォルトの名無しさん
2008/08/20(水) 02:02:27読みたくば●を買え
C言語なら俺に聞け(入門篇) Part 12
http://pc11.2ch.net/test/read.cgi/tech/1178620766/951-952
0469デフォルトの名無しさん
2008/08/20(水) 02:04:57これでダメな場合って lop==0 の時以外にあるかな?
result=lop*rop;
if(result/lop!=rop) オーバーフロー
952 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/15(火) 14:54:12
>>951
っ lop=-1 rop=INT_MIN
0470402
2008/08/20(水) 09:34:26ありがとうございます。
今作っている物は1秒ごとの判断で良かったので最終的にtime()関数を使うことにしました。
gettymeofday();も今度試してみます。
0471デフォルトの名無しさん
2008/08/20(水) 10:39:41scanf("%d",&a);
nibai(a);
printf("二倍した数値は%d\n",a);
と書くと2倍してくれないんですが、何故でしょうか?
-----------------------------------------------------------
#include<stdio.h>
int nibai(int x);
int main(void){
int a;
printf("数値を入力してください:");
scanf("%d",&a);
printf("二倍した数値は%d\n",nibai(a));
return 0;}
int nibai(int x){
int wk;
wk=x*2;
return wk;}
0472デフォルトの名無しさん
2008/08/20(水) 10:59:390473デフォルトの名無しさん
2008/08/20(水) 11:00:37ありがとうございます。
0474ym
2008/08/20(水) 13:43:00プログラムを教えてください。お願いします。
チェック内容は以下の通りです。
1. 受け渡された文字列が全て数値であること。
2. 受け渡された文字列の先頭2文字が'00'〜'23'の範囲であること。
3. 受け渡された文字列の3文字目〜4文字目が'00'〜'59'の範囲であること。
正常終了時:return 0
異常終了時:return -1(時刻範囲外)
0475デフォルトの名無しさん
2008/08/20(水) 13:45:10宿題スレへ行ってください。
0476デフォルトの名無しさん
2008/08/20(水) 13:48:490477ym
2008/08/20(水) 13:57:04char mm[3];
int h;
int m;
hh[0]=pstime[0];
hh[1]=pstime[1];
hh[2]='\0';
mm[0]=pstime[2];
mm[1]=pstime[3];
mm[2]='\0';
h=atoi(hh);
m=atoi(mm);
if((h >= 0 && h <= 23)&& (m >= 0 && m <= 59)){
return RET_OK;
}else{
return RET_NG;
}
}
int main(void)
{
char str[256];
int chk;
gets(str);
chk = N60901D04(str);
printf("\nreturn=%d\n",chk);
}
受け渡された文字列が'0000'〜'2359'の時刻範囲内かをチェックするプログラムなんですけど、コンパイルをしたら、
アルファベット4文字を入力してもreturn 0(正常)で判定されてしまったん
ですけど、プログラムの中のどこが悪かったのか、教えてください。お願いします。
0478デフォルトの名無しさん
2008/08/20(水) 13:59:57isdigit とかで先にチェックするとか。
0479デフォルトの名無しさん
2008/08/20(水) 14:00:28int main(int argc, char *argv[])
{
char *p;
int n;
for(p=argv[1] ; *p ; p++)
switch(*p)
{
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break;
default: return -1;
}
switch(argv[1][0])
{
case '0': case '1': break;
case '2':
switch(argv[1][1])
{
case '0': case '1': case '2': case '3': break;
}
default: return -1;
}
switch(argv[1][2])
{
case '0': case '1': case '2': case '3': case '4': case '5': break;
default: return -1;
}
return 0;
}
0480デフォルトの名無しさん
2008/08/20(水) 14:01:42atoiで変換は失敗すると0を返すからじゃね
0481デフォルトの名無しさん
2008/08/20(水) 14:02:110482デフォルトの名無しさん
2008/08/20(水) 14:03:474桁目のチェックが抜けてないか?
0483デフォルトの名無しさん
2008/08/20(水) 14:05:20必要あるか?
0484デフォルトの名無しさん
2008/08/20(水) 14:05:42あーそうだね
switch(argv[1][2])
{
case '0': case '1': case '2': case '3': case '4': case '5': if(argv[1][3]) break;
default: return -1;
}
こうか
0485デフォルトの名無しさん
2008/08/20(水) 14:07:05ある
[3]が\0のときも無視して通してしまう
0486デフォルトの名無しさん
2008/08/20(水) 14:09:08switch(argv[1][0])
{
case '0': case '1': if(argv[1][1]) break;
だな
0487デフォルトの名無しさん
2008/08/20(水) 14:22:21{
int i, hour, second;
if (strlen(hhss) != 4) return -1;
for (i = 0; i < 4; i++) if (!isdigit(hhss[i])) return -1;
hour = (hhss[0] - '0') * 10 + (hhss[1] - '0');
second = (hhss[2] - '0') * 10 + (hhss[3] - '0');
return (0 <= hour && hour < 24 && 0 <= second && second < 60) ? 0 : -1;
}
0488デフォルトの名無しさん
2008/08/20(水) 14:29:42int型の2次元配列の先頭のポインターだけをもらってくる関数があります。
配列のサイズはわかっているんですが関数内で見る際にはどう記述すればいいでしょうか?
これを関数内でいじりたい
unsigned int hoge2div[100][200];
関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。
(unsigned int* )hoge->ptr = hoge2div;
関数内の定義(ここを直したい。)
unsigned int* 2div = (unsigned int* )2div->ptr;
0489デフォルトの名無しさん
2008/08/20(水) 14:30:40>(unsigned int* )hoge->ptr = hoge2div;
こっちが正解です
hoge->ptr = hoge2div;
0490デフォルトの名無しさん
2008/08/20(水) 14:36:520491デフォルトの名無しさん
2008/08/20(水) 17:56:490492デフォルトの名無しさん
2008/08/20(水) 18:11:18変えたいから変えたんだよ
お前いちいちうるせえから
0493デフォルトの名無しさん
2008/08/20(水) 18:13:26おまえ>>339だろ
0494デフォルトの名無しさん
2008/08/20(水) 18:14:370495デフォルトの名無しさん
2008/08/20(水) 18:24:100496デフォルトの名無しさん
2008/08/20(水) 18:25:400497デフォルトの名無しさん
2008/08/20(水) 19:31:34http://pc11.2ch.net/test/read.cgi/tech/1217741118/241
0498デフォルトの名無しさん
2008/08/20(水) 20:39:13int check(const char *str){
char buf[4+1];
int hour, minute, chk;
if(sscanf(str, "%4[0-9]%n", buf, &chk)!=1 || str[chk]!='\0') return -1; // 四桁の数値か?
if(sscanf(str, "%2d%2d", &hour, &minute)!=2) return -1; // 時分に分割する
if(hour<0 || hour>=24 || minute<0 || minute>=60) return -1; // 数値の範囲は適正か?
return 0;
}
0499デフォルトの名無しさん
2008/08/20(水) 21:25:16キーボードからの入力で英語の入力をしたいんですけど
do{
printf("入力1を入力してください\n");
fgets(buf1,LEN,stdin);
printf("入力1\n");
printf("%s\n",buf1);
printf("入力2を入力してください\n");
fgets(buf2,LEN,stdin);
printf("入力2\n");
printf("%s\n",buf2);
printf("これでよろしいですか? Yes:1 No:0\n");
scanf("%d",&n);
}while(!n);
これを実行すると入力2しか入力できなく
入力1がおかしいのかと思って入力1をなくすと入力2が入力できなくなってしまうのですが
何がおかしいのでしょうか?
0500デフォルトの名無しさん
2008/08/20(水) 21:30:40エスパーフル活用
buf1 のサイズが足りていない または 有効な場所を指していない
buf2 のサイズも足りていない または 有効な場所を指していない
ポインタでよくある間違いと見た
0501デフォルトの名無しさん
2008/08/20(水) 21:42:12インプット/アウトプットはシステムの基本
0502デフォルトの名無しさん
2008/08/20(水) 21:43:11if(sscanf(str, "%4[0-9]%n", buf, &chk)!=1 || str[chk]!='\0') return -1; // 四桁の数値か?
↓
if(sscanf(str, "%4[0-9]%n", buf, &chk)!=1 || chk!=4 || str[chk]!='\0') return -1; // 四桁の数値か?
0503499
2008/08/20(水) 21:49:11すいませんの騒がせしました、解決しました
意見ありがとうございました
0504デフォルトの名無しさん
2008/08/20(水) 21:54:10前入力の \n だったか
オレのESPも錆付いたもんだな
0505デフォルトの名無しさん
2008/08/20(水) 23:05:34typedef unsigned char BYTE;
int IsBigEndian(void){
int x = 1; //00 00 00 01ならBE
if(*((BYTE *)&x + sizeof(int)) == 1) return 1; //末尾の1byteをチェック
return 0;
}
int IsLittleEndian(void){
int x = 1; //01 00 00 00ならLE
if(*(BYTE *)&x == 1) return 1; //先頭の1byteをチェック
return 0;
}
あと、バイトオーダーとか色々と違う環境をエミュレートするにはどうすればいいんですかね?
フリーでそういうアプリとかあります?VM使えばできるのかな?
0506デフォルトの名無しさん
2008/08/20(水) 23:07:03int IsBigEndian(void){
int x = 1; //00 00 00 01ならBE
if(*((BYTE *)&x + sizeof(int) - 1) == 1) return 1; //末尾の1byteをチェック
return 0;
}
0507デフォルトの名無しさん
2008/08/20(水) 23:08:40行き過ぎてない?
0508デフォルトの名無しさん
2008/08/20(水) 23:10:17qemu ならできるかもしれない
0509デフォルトの名無しさん
2008/08/21(木) 03:52:05どうしてでしょうか?
#include<stdio.h>
#include<limits.h>
int main(void)
{
int idt;
printf("数値を入力してください:");
scanf("%d",&idt);
if(idt>INT_MAX){
printf("オーバーフローしました。 int型最大値は2147483647です\n");
}else if(idt<INT_MIN){
printf("オーバーフローしました。 int型最小値は-2147483647です\n");
}else if(idt !=INT_MAX,INT_MIN){
printf("数値入出力 %d\n",idt);
}
return 0;
}
0510デフォルトの名無しさん
2008/08/21(木) 03:54:03おもしろい
0511デフォルトの名無しさん
2008/08/21(木) 03:55:42printf("オーバーフローしました。 int型最大値は2147483647です\n");
これで検出できないからオーバーフロー
そもそも、オーバーフローするような数字はscanfでidtに格納されない。
0512509
2008/08/21(木) 03:58:03オーバーフローを根本的に理解してないみたいです。
ありがとうございました。
0513デフォルトの名無しさん
2008/08/21(木) 04:02:05針は50Kを指しているが、一周回っている。
0514デフォルトの名無しさん
2008/08/21(木) 04:23:49あれはどうやって計算しているんだろうか?
64ビットを使っている?それとも万単位で計算?
それとも特殊は数字変数を使っている?
0515デフォルトの名無しさん
2008/08/21(木) 04:32:45普通に多倍長整数じゃないのかと思うわけで
0516デフォルトの名無しさん
2008/08/21(木) 04:37:540517デフォルトの名無しさん
2008/08/21(木) 04:39:39Cでやるとコードが大変になりそう
0518デフォルトの名無しさん
2008/08/21(木) 05:39:32int main()
{
char *pt;
pt = "text";
printf("%s",pt);
return 0;
}
ポインタにはアドレスしか代入できないと聞いたのですが文字列ならできるのでしょうか
0519デフォルトの名無しさん
2008/08/21(木) 06:03:560520デフォルトの名無しさん
2008/08/21(木) 06:39:36メモリ上に配置した文字列のアドレスを入れてんねん
0521デフォルトの名無しさん
2008/08/21(木) 10:12:09アドレスに文字列を入れたのではなく、アドレスの先頭を指すptに文字列を入れると。
コンパイラさんが自動的に配列作ってごにょんごにょしてくれる。
0522デフォルトの名無しさん
2008/08/21(木) 10:45:32not 配列
0523ym
2008/08/21(木) 10:49:04正常終了時は、return 0
異常終了時は、return-1(時刻範囲外)で判定するプログラムなんですけど、
本当は、数字5文字以上だったら、異常(return -1)にならないといけないはずが、
コンパイルをして、数字5文字で入力して確認してみたら正常(return 0)になってしまいました。
どうしたら、数字5文字以上だったら、異常(return -1)になるかを教えてください。
お願いします。
0524デフォルトの名無しさん
2008/08/21(木) 10:50:11(配列変数を初期化するとき以外では)文字列が配列だってのは合っているだろ。
0525デフォルトの名無しさん
2008/08/21(木) 10:56:55またあんたか。
つstrlen
時刻なら、4桁でも9999みたいなのも弾かないといけないんだろうけど名。
0526デフォルトの名無しさん
2008/08/21(木) 11:15:57char time[24*60][5]={
"0000",
・
・
・
"0059",
"0100",
・
・
・
"2359"
};
int i, ret = -1;
for(i = 0; i < 24*60; i++){
if(!strcmp(str, time[i])){
ret = 0;
break;
}
}
return ret;
}
0527デフォルトの名無しさん
2008/08/21(木) 11:36:26ワラタ もうこれでいいだろ>ym
0528デフォルトの名無しさん
2008/08/21(木) 11:45:200529デフォルトの名無しさん
2008/08/21(木) 12:35:11全部は書ききれないのでこれを実行してください
int main()
{
int i, j;
puts("int istimeformatstr(const char *str){\n char time[24*60][5]={");
for (i = 0; i < 24; ++i) {
for (j = 0; j < 60; ++j) {
printf("%02d%02d,\n", i, j);
}
}
puts(" };\n int i, ret = -1;\n for(i = 0; i < 24*60; i++){\n"
" if(!strcmp(str, time[i])){\n ret = 0;\n break;\n"
" }\n }\n return ret;\n}\n");
return 0;
}
0530デフォルトの名無しさん
2008/08/21(木) 13:44:41#include <stdio.h>
#include <string.h>
#define TIME H(00) H(01) H(02) H(03) H(04) H(05) H(06) H(07) H(08) H(09) H(10) H(11) H(12) H(13) H(14) H(15) H(16) H(17) H(18) H(19) H(20) H(21) H(22) H(23)
#define H(x) M(x##0) M(x##1) M(x##2) M(x##3) M(x##4) M(x##5)
#define M(x) Q(x##0) Q(x##1) Q(x##2) Q(x##3) Q(x##4) Q(x##5) Q(x##6) Q(x##7) Q(x##8) Q(x##9)
#define Q(x) #x##,
int istimeformatstr(const char *str){
char time[24*60+1][5] = {TIME NULL};
int i, ret = -1;
for(i = 0; i < 24*60; i++){
if(!strcmp(str, time[i])){
ret = 0;
break;
}
}
return ret;
}
int main(int argc, char **argv){
if(argc != 2) return -1;
if(!istimeformatstr(argv[1])) puts("good");
else puts("bad");
return 0;
}
0531デフォルトの名無しさん
2008/08/21(木) 13:50:53good
0532デフォルトの名無しさん
2008/08/21(木) 14:39:02long bbb[10][10];
long * pcount[2] = {aaa,bbb};
って書いてコンパイルエラーになるんだけどなんで?
error C2440: '初期化中' : 'long [10][10]' から 'long *' に変換できません。
0533デフォルトの名無しさん
2008/08/21(木) 14:40:18エラーメッセージのとおりです
0534デフォルトの名無しさん
2008/08/21(木) 14:40:470535デフォルトの名無しさん
2008/08/21(木) 14:46:140536デフォルトの名無しさん
2008/08/21(木) 14:46:44long aaa[10][10];
long bbb[10][10];
long (*pcount[2]) [10][10];
pcount[0] = &aaa;
pcount[0] = &bbb;
0537デフォルトの名無しさん
2008/08/21(木) 14:47:300538デフォルトの名無しさん
2008/08/21(木) 14:48:030539デフォルトの名無しさん
2008/08/21(木) 14:48:18aaaは先頭要素のアドレスじゃなかった?
0540デフォルトの名無しさん
2008/08/21(木) 14:50:17long aaa[10][10];
long bbb[10][10];
long *pcount[2] = {(long*)aaa,(long*)bbb};
で通った。ってことはそもそもaaaの型ってintなのかな。
0541デフォルトの名無しさん
2008/08/21(木) 14:52:42過去スレで盛り上がったポインターに成り下がるとかってやつじゃないの?
めんどくさければこれでもいいんじゃね?
void *pcount[2] = { aaa, bbb};
0542デフォルトの名無しさん
2008/08/21(木) 14:56:12long (*pcount[2])[10][10]={&aaa, &bbb};
要素にアクセスするときは
(*pcount[0])[0][0]
とか
0543デフォルトの名無しさん
2008/08/21(木) 15:03:49初期化子の要素はロード時に計算され得ません
と警告がでるんですが、そもそもこれはどういう意味の警告なんでしょうか
0544デフォルトの名無しさん
2008/08/21(木) 15:06:13つまり、ポインターのほうがコンピューターにとっては自然な型なのだ。
配列は、それを人間が理解しやすいようにちょっと置き換えたもの。
同一のものではないが、実体はやはりポインターと同じようにアドレスで管理されている。
だから簡単にポインターに成り下がる(ことができる)。
0545デフォルトの名無しさん
2008/08/21(木) 15:07:32>>536 方式で初期化すればいける
gcc だと >>542 でいけたから気づかなかった
0546デフォルトの名無しさん
2008/08/21(木) 15:09:251次元配列をアセンブラ展開した際の配列にアクセス処理部分の位置計算
ptr + n1 x n2
ptr ・・・・ 配列の先頭アドレス
n1 ・・・・ 各型ごとのバイト数
n2 ・・・・ 配列のインデックス
0547デフォルトの名無しさん
2008/08/21(木) 17:27:32残りの文字列をゼロサプレスするプログラムを教えてください。
ゼロサプレスの処理例は以下の通りです。
'ABC001' → 'ABC1'
'ABC010' → 'ABC10'
文字列長が4でない場合、後ろを空白で埋める。
返却値は、0:正常 1:異常 です。
お願いします。
0548デフォルトの名無しさん
2008/08/21(木) 17:32:53どの部分が分からないの?
1.先頭3文字がアルファベットの場合
2.残りの文字列をゼロサプレスする <- 意味が分からん
3.文字列長が4でない場合、後ろを空白で埋める。 <- 意味が分からん
4.返却値は、0:正常 1:異常 <- 正常の定義が分からん
0549デフォルトの名無しさん
2008/08/21(木) 17:33:59char main = {0xf0,0x0f,0xc7,0xc8};
0550デフォルトの名無しさん
2008/08/21(木) 17:49:33質問っていうか丸投げしすぎだろ
0551デフォルトの名無しさん
2008/08/21(木) 17:51:15まー日本のIT業界は理系をいかにうまく使うかがのし上がって行く上で重要?
らしいので、そういう訓練をここでやってるのかもな〜〜w
0552デフォルトの名無しさん
2008/08/21(木) 17:56:490553デフォルトの名無しさん
2008/08/21(木) 17:59:040554デフォルトの名無しさん
2008/08/21(木) 18:00:280555デフォルトの名無しさん
2008/08/21(木) 18:02:58>>547のような冒頭読んだだけでスレ住人を使う気満々な丸投げは放置に限るなw
0556デフォルトの名無しさん
2008/08/21(木) 18:05:44あれって工業高校・大学・専門のどれかだよね
大学行ってまでじゃんけんゲームやら文字列操作なんかやりたくないなと思う@普通化高校生
0557デフォルトの名無しさん
2008/08/21(木) 18:08:39何がやりたいんだよ
ちなみに文字列操作は色々と落とし穴があって面白いぞ
0558デフォルトの名無しさん
2008/08/21(木) 18:10:05文字列は面倒だな。
特にネットが絡むとS-JISだとかEUCだとか・・・もうねw
まだグラフィック関連いじってるほうが楽だったりする。
フォーマット決まれば所詮は色情報を持った2次元配列。
0559デフォルトの名無しさん
2008/08/21(木) 18:13:44実際に作るものは低レベルでいい
0560デフォルトの名無しさん
2008/08/21(木) 18:15:560561デフォルトの名無しさん
2008/08/21(木) 18:18:070562デフォルトの名無しさん
2008/08/21(木) 18:21:160563デフォルトの名無しさん
2008/08/21(木) 20:18:58これって違う環境でコンパイルしたバイナリだと別の環境だとバグが出るかもってことだよね
でも普通のインストーラってOS別とかはあるけど、エンディアン別のインストーラーとかint2byte環境用インストーラーとかは見たことがない
これって環境別のバイナリを配布側がいちいち全部用意して、その環境にあってるバイナリを選んでコピーとかしてるんですかね?
それともインストーラーはコンパイルとソースを積んでてクライアントのパソコンでコンパイルしてるの?
多分バイナリを用意してるんだと思うけど、色んな環境用のバイナリ用意するのって大変じゃないすか?
0564デフォルトの名無しさん
2008/08/21(木) 20:22:48>これって違う環境でコンパイルしたバイナリだと別の環境だとバグが出るかもってことだよね
同じCPUでもOSがlinuxかwindowsかでバイナリが使えないとかありますが・・?
(linuxの一部のwinアプリ動かすの除く、windows上でも仮想環境のソフト下のぞく)
でもwindows環境だと32bit向けにコンパイルされてても64bitOS化で実行も可能ですが。
0565デフォルトの名無しさん
2008/08/21(木) 20:24:10ターゲット以外の環境では動かないし、そもそもインストーラすら動作しない
色んな環境用のバイナリを用意するのは確かに大変
Java ならある程度複数の環境で動作するようだけどな
0566デフォルトの名無しさん
2008/08/21(木) 20:24:14まずはもう少しパソコンに慣れろ
0567デフォルトの名無しさん
2008/08/21(木) 20:34:59動かす環境によってバグが出るとかはあるかもね
0568デフォルトの名無しさん
2008/08/21(木) 20:56:10CPUが違えば動かないのは当たり前だろ馬鹿
intのサイズはコンパイラ内で完結する問題でCPUやOSでintのサイズが決まってるわけではない
同じソースがコンパイラが違うと動かないというのならわかるが
0569デフォルトの名無しさん
2008/08/21(木) 21:00:44これはちょっと微妙に突っ込みを入れられそうだな。
確かに抽象レイヤーではそうだが。
0570デフォルトの名無しさん
2008/08/21(木) 21:03:170571デフォルトの名無しさん
2008/08/21(木) 21:20:070572デフォルトの名無しさん
2008/08/21(木) 21:22:130573デフォルトの名無しさん
2008/08/21(木) 21:40:250574デフォルトの名無しさん
2008/08/22(金) 00:04:47多分恐らくなかなかどうして4byteっすよwwwwww
0575デフォルトの名無しさん
2008/08/22(金) 00:08:34昔は2バイトだったし
0576デフォルトの名無しさん
2008/08/22(金) 00:15:090577デフォルトの名無しさん
2008/08/22(金) 00:19:000578デフォルトの名無しさん
2008/08/22(金) 01:39:280579デフォルトの名無しさん
2008/08/22(金) 04:42:54その読み出し位置は別途もらうindexでわかるんですが
取り出す場合どう記述すればスマートでしょうか?
0580デフォルトの名無しさん
2008/08/22(金) 05:05:40そのchar配列がポインタなら素直に
*(int*)(charポインタ+index)とでもすればいいんじゃない?
0581デフォルトの名無しさん
2008/08/22(金) 05:10:590582デフォルトの名無しさん
2008/08/22(金) 05:12:54ありがとうございます。
>>581
現在がその状態なんですが、現在チューニングしてまして
あまり改造せずに速度をあげれないかなあと思いまして・・・
0583デフォルトの名無しさん
2008/08/22(金) 06:07:07unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
}BITMAPFILEHEADER;
sizeof(BITMAPFILEHEADER)が16になってしまい
fwrite((void*)&bmf,sizeof(BITMAPFILEHEADER),1,fp);
などで読み書きすると、うまくいきません
スマートに処理させるにはどうしたらいいでしょうか
0584デフォルトの名無しさん
2008/08/22(金) 07:02:32コンパイラは何だよ
packのしかたはコンパイラで違う
#include <windows.h>いれとけば定義済みだよ
0585デフォルトの名無しさん
2008/08/22(金) 08:18:41定義済みのにsizeofすると14バイトだけど↑の条件で作ったのは16バイトになった。
なんで定義済みのはパディング入ってないんだろう。
0586デフォルトの名無しさん
2008/08/22(金) 08:54:00#include <windows.h>
でうまくいきました。ありがとうございます。
0587デフォルトの名無しさん
2008/08/22(金) 09:37:46>>584みてわかるべ。
今のwindows.hは定義の直前に#include <pshpack2.h>
って入ってるね。pshpack2.hの中身は#pragma pack(push,2)か#pragma pack(2)
0588デフォルトの名無しさん
2008/08/22(金) 19:20:42char配列のポインタをもらってくるのであれば>>580の方法でもよさそうですが
char配列そのものしかわからない場合はどう書けばいんでしょうかね?
配列のインデックの移動基準はcharベース。
でも場所が決まった場合はchar、short、intのそれぞれで
アクセス(読み書き)したい。
0589デフォルトの名無しさん
2008/08/22(金) 19:29:21>>580なにも問題はないだろ
0590デフォルトの名無しさん
2008/08/22(金) 19:35:42配列を貰うというのは要するにアドレスを貰うわけだからポインタで貰うのと変わらないよ。
複数の型でアクセスしたいなら char short int のポインタを含む共用体を用意して、
それに &char配列名[インデックス] でアドレス入れればいい。
0591デフォルトの名無しさん
2008/08/22(金) 20:18:45str++;
len++;
}
って書くのと
while(*str) len++, str++;
って書くのどっちがいい?
0592デフォルトの名無しさん
2008/08/22(金) 20:21:040593デフォルトの名無しさん
2008/08/22(金) 20:25:57個人的には{ }ではさむのは2つ以上の処理を書く場合かな。
1個だけなら1行にする
0594デフォルトの名無しさん
2008/08/22(金) 20:39:37long *p;
p=(long*)&x[0];
printf("%ld\n", *p); // これはOKになる可能性が高い
p=(long*)&x[1];
printf("%ld\n", *p); // これはバスエラーになる環境もある
0595588
2008/08/22(金) 20:49:42なるほど〜
実は>>588で質問した内容は配列の中身はリトルエンディアンが保障されているんですが
ソースはビッグエンディアン環境下でもコンパイルできるようにマクロ内部で
char配列から1バイトごとに読み出しては型にあわせて任意ビットシフトした後格納を
やっています。
そのソースを使おうとしてる環境はリトルエンディアンなので本来はダイレクトにアクセス
したほうが速度があがるだろうと教えてもらったようにマクロを書き換えてコンパイルして
みたところ、フリーズというところではまってます。
マクロ化したエンディアン吸収部分はかなりいろんな箇所で使われてて手動で直すのは
大変なのでなんとかできれば・・と思ってたんですが・・・・
0596デフォルトの名無しさん
2008/08/22(金) 20:55:340597デフォルトの名無しさん
2008/08/22(金) 20:57:58ボトルネックはそこなのか?
それが問題だ
0598デフォルトの名無しさん
2008/08/22(金) 21:00:42あーそういのもありますね。
>>597
そうですね〜
かなりの頻度でそのchar配列に読み書きが行われるはずですので
(そういう性質の物ですし)
0599デフォルトの名無しさん
2008/08/22(金) 21:30:010600588
2008/08/22(金) 21:57:38アライメント・・・
詳しくないので調べてみました。
http://slashdot.jp/developers/comments.pl?sid=376738&threshold=1&commentsort=3&mode=thread&cid=1231973
つまりchar(バイト単位)でポインターを移動させた場合
環境によっては開始位置によってはshortやintで読み出せないということでしょうか?
0601デフォルトの名無しさん
2008/08/22(金) 22:15:10また、できたとしても普通より遅くなるってCPUもある、x86とか。やっぱり避けるべき。
0602588
2008/08/22(金) 22:19:40x86が奇数アドレスなんかをまたぐとペナルティがある
(内部的に読みやすいアドレスで複数回読み込んで合成して処理するのでクロックを食うでしたっけ?)
のは知ってましたが駄目なCPUもあるんですねえ。
0603デフォルトの名無しさん
2008/08/22(金) 22:22:02環境というかCPUだね。
x86は問題がないでしょ。だけど、ダメなCPUもある。
奇数のアドレスを整数でアクセスでバスエラーとか。
0604デフォルトの名無しさん
2008/08/22(金) 22:31:380605588
2008/08/22(金) 22:33:43同じリトルエンディアンなんで期待したんですが・・・・
0606デフォルトの名無しさん
2008/08/22(金) 23:59:280607デフォルトの名無しさん
2008/08/23(土) 00:24:53なんだって?・ちがうだろ。
どちらにしてもビットシフトなんてしないといけないか?
struct INT
{
unsigned char b[4];
};
swap(b[0], b[3]);
swap(b[1], b[2]);
くらいの程度ちゃうのか?わからんけど
0608588
2008/08/23(土) 00:28:22下記マクロをリトルエンディアンで最適にアクセスできるように直したいのですが
#define LOADINTELDWORD(a) (((UINT32)(a)[0]) | \
((UINT32)(a)[1] << 8) | \
((UINT32)(a)[2] << 16) | \
((UINT32)(a)[3] << 24))
#define LOADINTELWORD(a) (((UINT16)(a)[0]) | ((UINT16)(a)[1] << 8))
#define STOREINTELDWORD(a, b) *((a)+0) = (UINT8)((b)); \
*((a)+1) = (UINT8)((b)>>8); \
*((a)+2) = (UINT8)((b)>>16); \
*((a)+3) = (UINT8)((b)>>24)
#define STOREINTELWORD(a, b) *((a)+0) = (UINT8)((b)); \
*((a)+1) = (UINT8)((b)>>8)
0609588
2008/08/23(土) 00:30:03MIPS系のCPUでリトルエンディアンで動いてます。
配列のアドレス決定はchar単位ですがアクセスはshort,intがあります。
intはそれほどアクセス頻度は無いので現在のロジックでもいいと思いますが
shortが多発すると思われますので改善したいんです。
0610デフォルトの名無しさん
2008/08/23(土) 00:34:130611588
2008/08/23(土) 00:36:22元のソースそのまんまなのであまり詳しくは把握できてないんです^^;
0612デフォルトの名無しさん
2008/08/23(土) 00:48:56なにを改善したいんだよ。
方法としては、シフトして論理和とるか、>>607のように入れ替えるかの
二つしかないんだから、どっちが速いか実測しろよ。
0613デフォルトの名無しさん
2008/08/23(土) 07:57:54そっちをちょっと改善したほうがずっと速くなるなんてことも有り得る。
0614デフォルトの名無しさん
2008/08/23(土) 08:01:21某エミュレーターの内部じゃねーの?
LOADINTELなんちゃらってそれでみたぞ。
x86エミュだとやっぱりメモリアクセスの改善が一番じゃね?
0615デフォルトの名無しさん
2008/08/23(土) 09:37:10charの配列からサイズの異なるデータを抜くのはやっぱりシフトして論理和ってのがよくある奴だし枯れてる書き方だし触らない方がいいと思う。
こんなところに労力をかけるより、ボトルネックが他にあるはずだ。
抜いてきたデータをそのまま使うんじゃなくて加工する箇所はあるでしょ、おそらく。
データを抜くコストより、加工のコストの方が高いはずだからそこの無駄を省く方がいいと思うけど。
関数コール1個減らすとかだけでもお釣りが来るよ。
シフトと論理和のコストの方が重い処理ってなんだよ、と、ソース見てない私はそう思う。
それでもこの部分を根本から変えたいなら、ターゲットとなるCPUを変更せよ(ぇ
まぁ、shortだけなら、>>608のマクロ変形して
#define LOADINTELWORD(a) (((unsigned long)(a) & 1) ? (((UINT16)(a)[0]) | ((UINT16)(a)[1] << 8)) : *((UINT16*)(a)))
ってやれば偶数アドレスのときだけならそのままshortで抜いてこれる。
といってもこの場合でも、偶数アドレスで始まるUINT16がある程度多くないと比較で増えた分のコストを吸収できない。
0616デフォルトの名無しさん
2008/08/23(土) 13:03:450617デフォルトの名無しさん
2008/08/23(土) 13:12:40static REG8 MEMCALL memmain_rd8(UINT32 address) {
return(mem[address]);
}
こういった関数をなくすだけでも早くなるんじゃないかな
0618デフォルトの名無しさん
2008/08/23(土) 13:32:120619デフォルトの名無しさん
2008/08/23(土) 14:06:11#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *str;
str = malloc(1);
if(str == NULL) {
printf("メモリが確保できません\n");
exit(EXIT_FAILURE);
}
/* 文字列を入力 */
gets(str);
/* 文字列の表示 */
puts(str);
/* メモリの解放 */
free(str);
return 0;
}
とあるんですがstr=malloc(1)とやって 3文字入力したら普通に出力できてしまいます
1とあるので1文字だけかと思ったら。
str=mallock(1);とは char st[1]="a";じゃないんですか?
何故、1文字以上出力できるかがわかりません。
詳しい方教えてください。
0620デフォルトの名無しさん
2008/08/23(土) 14:07:190621デフォルトの名無しさん
2008/08/23(土) 14:11:05バッファオーバーフローしています
自分で範囲を超えないように管理しないといけません
0622デフォルトの名無しさん
2008/08/23(土) 14:12:08これってさ、関数ポインタの配列で呼んでるっぽいな。
MEMCALL部分って配列化するときのインデックスか何かの関連だろ。
0623デフォルトの名無しさん
2008/08/23(土) 14:51:34できるってことですか?
char *str;
scanf("%s",str);ではできませんが
char str[100];
scanf("%s",str);はできて
str=malloc(100)ってことでstr[100]になるってことですよね?
mallocを使うことによって配列みたいになるんですか?
0624デフォルトの名無しさん
2008/08/23(土) 14:54:11正式に確保したのは1なんだが、それ以降もたまたま書き込める状態だったということ
0625デフォルトの名無しさん
2008/08/23(土) 14:58:19書き込める場所を確保するという意味ではあってる
一応char * str=malloc(100) とchar str[100]でいくつか違いはあるので全く同じではないが
0626デフォルトの名無しさん
2008/08/23(土) 15:01:11C言語の文字列って何かってところから勉強しよう。
mallocはまだ早い。
> str=mallock(1);とは char st[1]="a";じゃないんですか?
そういう使い方できるけどそれは1文字の文字列じゃない。
char st[1]だと0文字の文字列しか入れられない。
たぶん意味わかんないだろうけどどういう意味か勉強してください。
> 何故、1文字以上出力できるかがわかりません。
> 詳しい方教えてください。
詳しい方なら3文字入る環境があることはわかっているが、
「たまたま動いているだけだからそんな使い方しないでください」
というアドバイスの方がよさそうだな。
0627デフォルトの名無しさん
2008/08/23(土) 15:01:46>>619ね
0628デフォルトの名無しさん
2008/08/23(土) 15:04:14mallocで領域確保するしないの問題と
>char *str;
>scanf("%s",str);ではできませんが
>char str[100];
>scanf("%s",str);はできて
これは分けて考えないと。
mallocっていうのはアプリケーションとOSとの間のやり取りで見ると
その都度要求のあったメモリサイズをちまちまOSから借りてくるわけではなく
何らかのタイミング(アプリケーション起動時、もしくはアプリケーションが最初に発行するmalloc)
である程度の大きさのメモリを借りてきます。
たまたまあなたの作ったアプリケーションが借りてきたメモリが実は1バイト以上なので
malloc(1)で確保したエリアに3文字書いてもエラーにならかった分けです。
この辺はヒープという単語でググってください。
で、
>char *str;
>scanf("%s",str);ではできませんが
こっちはstrポインタだけで文字を収める先が用意されてないので駄目です。
>char str[100];
>scanf("%s",str);はできて
こちらはstrは100個の文字を収める場所がありますので当然OKです。
0629デフォルトの名無しさん
2008/08/23(土) 15:22:56丁寧なお答えありがとうございます
ですがmalloc(1)の場合は1バイトではなく何バイトなんでしょうか?
0630デフォルトの名無しさん
2008/08/23(土) 15:24:16使っていいのは 1 バイト
0631デフォルトの名無しさん
2008/08/23(土) 15:25:44いや、それは環境によっても違うし、設定によっても違うし。
0632デフォルトの名無しさん
2008/08/23(土) 15:30:11正確にわかる方法はあるんですか?
0633デフォルトの名無しさん
2008/08/23(土) 15:31:46各環境ごとに初期割り当てサイズとかあるんで
0634デフォルトの名無しさん
2008/08/23(土) 15:35:58ない。
4バイトごとに確保する領域を繰り上げる環境もあるし、本当に1バイトしか使えない環境もある。
それにそれが判ったからといって、指定した領域以上の領域を使うようなことをしてはいけない。
0635デフォルトの名無しさん
2008/08/23(土) 15:38:20ほーこれがややこしくてわかりずらかったです
やっとわかりました
誠にありがとうございます
0636デフォルトの名無しさん
2008/08/23(土) 15:59:15○わかりづらかった
0637デフォルトの名無しさん
2008/08/23(土) 16:32:110638デフォルトの名無しさん
2008/08/23(土) 17:02:230639デフォルトの名無しさん
2008/08/23(土) 17:08:311バイト超えて使えるのは何で?って聞いてるんだしいいだろうがw
でも、ある程度上の説明で収まったからいいけどもっと程度低い
やつだとまだ延々と説明論議して疲れて放置とかなんだろうな。
0640デフォルトの名無しさん
2008/08/23(土) 17:12:34システムぶっ壊して起動できなくなるかもしれない、っていつも通り答えておくのが正しいんじゃない?
0641デフォルトの名無しさん
2008/08/23(土) 17:24:33xxバイトとっておいて1バイトとったことにしておこう、くらいだろう
0642デフォルトの名無しさん
2008/08/23(土) 17:27:17メモリどうたらいってますが、配列とかポインタでやってればメモリどうたらでも
普通に軽くうごくんですが
0643デフォルトの名無しさん
2008/08/23(土) 17:32:200644デフォルトの名無しさん
2008/08/23(土) 17:35:290645デフォルトの名無しさん
2008/08/23(土) 17:37:33何故 sizeof(char)と書くんでしょうか?
本にそう書いてありますが。 char型は1バイトだから malloc(1*10)とmalloc(sizeof(char)*1)
は同じなんでしょうか?
0646デフォルトの名無しさん
2008/08/23(土) 17:38:460647デフォルトの名無しさん
2008/08/23(土) 17:39:45初心者が言語仕様をちょろっと勉強した程度で使えるような甘っちょろい言語じゃない。
実際、学部とか修士とかで「Cをマスターしました」とかほざく新卒で、きちんとCプログラムを
書ける奴なんてほとんどいない。
最初はvb, java, python, ruby等々、お遊び言語でコンピュータに慣れとけ。
0648デフォルトの名無しさん
2008/08/23(土) 17:40:20これだと後でソース見た人が何のためにメモリをこれだけ確保したかわからないから?
あとcharだとほぼ1バイト固定だと思うけど
intあたりになると4バイトもあれば違うのもあったりするので
できればmalloc(sizeof(char)*1)とするほうがいい
0649デフォルトの名無しさん
2008/08/23(土) 17:44:44ほー じゃあ自分で書く分には
省略してmalloc(10)ってことでもいいんですよね?
他人が見てわかりずらいから キャストとかsizeofがあるのかぁ
参考になりました。
0650デフォルトの名無しさん
2008/08/23(土) 17:45:510651デフォルトの名無しさん
2008/08/23(土) 17:46:030652デフォルトの名無しさん
2008/08/23(土) 17:46:050653デフォルトの名無しさん
2008/08/23(土) 17:47:46それは誤解
キャストするのはコンパイラに教えるため。
あれは人間のためじゃない。
sizeofもそういう意味じゃない。
今の例はおおよそバイトサイズがわかるcharとかintだからいいけど
構造体を使いだしたらその都度計算するのか?ということになる。
本に書かれてることは間違ってることもあるが、利にかなってることもある。
0654デフォルトの名無しさん
2008/08/23(土) 17:48:54そうだなwww
自分で書いたソースも時間がたつと「これなんだっけ・・・?」で
悩むよな。
手を抜いて数字ばっかりでやりだすと糞ソース化する
0655デフォルトの名無しさん
2008/08/23(土) 17:49:220656デフォルトの名無しさん
2008/08/23(土) 17:49:30使えないと恥ずかしいとは思うけど、職業プログラマの現場でも、malloc()禁止とかはざらにあるな。
0657デフォルトの名無しさん
2008/08/23(土) 17:50:030658デフォルトの名無しさん
2008/08/23(土) 17:52:35#define hoge_char 0x1000
xxxx = malloc(hoge_char);
とかかな・・・
0659デフォルトの名無しさん
2008/08/23(土) 17:58:410660デフォルトの名無しさん
2008/08/23(土) 18:08:220661デフォルトの名無しさん
2008/08/23(土) 18:44:34C言語である限り、charは1バイト。
万が一charが2バイトだったら、そのコンパイラはCコンパイラとは呼べない。
malloc時にsizeof(char)をかけるかどうかは宗教的な問題で、
どちらが正しいということは無い。
どちらにも言い分があり、どちらも正しい。
0662デフォルトの名無しさん
2008/08/23(土) 18:52:050663デフォルトの名無しさん
2008/08/23(土) 18:53:220664デフォルトの名無しさん
2008/08/23(土) 18:59:440665デフォルトの名無しさん
2008/08/23(土) 19:02:10無理だねえ。
ある程度は可能だけど。
0666デフォルトの名無しさん
2008/08/23(土) 19:02:19むり。
0667デフォルトの名無しさん
2008/08/23(土) 19:05:42文字コードってどれほど種類あるか知ってるか?
0668デフォルトの名無しさん
2008/08/23(土) 19:48:140669デフォルトの名無しさん
2008/08/23(土) 19:49:38いやあっても問題ない。
コードに複数種類があるのが問題。
0670デフォルトの名無しさん
2008/08/23(土) 19:52:250671デフォルトの名無しさん
2008/08/23(土) 20:31:360672デフォルトの名無しさん
2008/08/23(土) 21:18:44実際に使えるものなどのコードをのせてみてください
0673デフォルトの名無しさん
2008/08/23(土) 21:27:07夏休みの宿題が残ってるんですね、わかります
0674デフォルトの名無しさん
2008/08/23(土) 21:29:22っSourceForge
0675デフォルトの名無しさん
2008/08/23(土) 21:57:010676デフォルトの名無しさん
2008/08/23(土) 22:05:35ネタでさらすわけにもいけないし、活用方法がないな。
0677デフォルトの名無しさん
2008/08/24(日) 00:36:24そんな世界ができたらまさに夢のようだな
0678側近中の側近 ◆0351148456
2008/08/24(日) 08:51:53最近書き込んでなかったね。C言語スレに。
おひさ☆
0679デフォルトの名無しさん
2008/08/24(日) 10:12:35#include <conio.h>
#define MAP_SIZE_Y 10
#define MAP_SIZE_X 10
int y=5;
int x=5;
int map[100][100]={
{1,1,1,1,1,1,1},
{1,0,0,3,0,0,1},
{1,0,0,0,0,0,1},
{1,0,2,0,2,0,1},
{1,0,0,0,0,0,1},
{1,1,1,1,1,1,1},
};
0680デフォルトの名無しさん
2008/08/24(日) 10:15:48int j,i;
for(j=0; j<MAP_SIZE_Y; j++)
{
for(i=0; i<MAP_SIZE_X; i++)
{
if(j==y && i== x)
{
printf("Y");
}else{
switch(map[j][i]){
default:printf(" "); break;
case 1: printf("*"); break;
case 2: printf("H"); break;
case 3: printf("K"); break;
}
}
}
printf("\n");
}
}
0681デフォルトの名無しさん
2008/08/24(日) 10:18:25switch(getch()){
case 'w': y--; break;
case 's': y++; break;
case 'a': x--; break;
case 'd': x++; break;
}
}
int main(void)
{
while(1){
system("clear");
drawmap();
getkey();
}
return 0;
}
マップ作成で主人公を動けるようにしたんですが、障害物にあたった時に進めないようにしたり
する方法がわかりません。
0682デフォルトの名無しさん
2008/08/24(日) 10:42:010683デフォルトの名無しさん
2008/08/24(日) 10:43:1310と定義して
>int map[100][100]={
100個確保して
>{1,1,1,1,1,1,1},
7個初期化・・・・
迷惑だからプログラム作るな。エロゲーでもやってろ。
0684デフォルトの名無しさん
2008/08/24(日) 10:45:34{
for (int j = 0; j < MAP_SIZE_Y; ++y) {
for (int i == 0; i < MAP_SIZE_X; ++i) {
putchar((j == y && i == x) ? 'Y' : map[j][i] >= 1 && map[j][i] <= 3 ? " *HK"[map[j][i]] : ' ');
}
putchar('\n');
}
}
0685デフォルトの名無しさん
2008/08/24(日) 10:47:31{1,1,1,1,1,1,1},
{1,0,0,3,0,0,1},
{1,0,0,0,0,0,1},
{1,0,2,0,2,0,1},
{1,0,0,0,0,0,1},
{1,1,1,1,1,1,1},
};
#define MAP_SIZE_Y (sizeof(map) / sizeof(* map))
#define MAP_SIZE_X (sizeof(* map) / sizeof(** map))
0686デフォルトの名無しさん
2008/08/24(日) 11:13:34うにコードはねぇ。当初はえらい騒ぎだったんですよ。sci.lang とかで。
今でも毛唐の陰謀だとおもっています。
0687デフォルトの名無しさん
2008/08/24(日) 11:15:03移動しようとした先に障害物があったら動かないようにすればいいだけ。
ヒントはすでにもらってるんだから自分で書いてみな。
ゲームっぽい何かを作ろうとしてるんだろうけど次は「アイテム取ったときには・・・」とか言うつもりだろ。
移動しようとした先にアイテムがあったらアイテムを取る処理すればいいだけ。
移動しようとした先に人がいたら会話処理すればいいだけ。
移動しようとした先に敵がいたら戦闘処理すればいいだけ。
移動しようとした先に階段があればマップ変更と座標移動すればいいだけ。
0688デフォルトの名無しさん
2008/08/24(日) 11:15:080689デフォルトの名無しさん
2008/08/24(日) 13:07:24#include <stdlib.h>
int main(void)
{
char *str;
int i,num;
scanf("%d",&num);
str=(char *)malloc(sizeof(char *)*(num+1));
if(!str){
printf("memori kakuho huka\n");
return 1;
}
for(i=0; i<num; i++){
*(str+i)+='a';
}
*(str+num)+='\0';
printf("%s\n",str);
free(str);
return 0;
}
これなんですが if(!str)のときメモリ確保できませんとありますが 0とうってもメモリ確保できないようですが
このメモリ確保できませんは どんなときにでるのでしょうか?
if(str)だと数字をいれれば エラーを表示できますが
0690デフォルトの名無しさん
2008/08/24(日) 13:12:000691デフォルトの名無しさん
2008/08/24(日) 13:12:23そんなことはない
0692デフォルトの名無しさん
2008/08/24(日) 13:13:16!strが0でないときだ
0693デフォルトの名無しさん
2008/08/24(日) 13:14:10こういうのややこしいですね
!str !っていうのは0だったらって習いましたが
0694デフォルトの名無しさん
2008/08/24(日) 13:14:33まずそのソースはお前が自分で書いたのか他人が書いたのかはっきりしろ
0695デフォルトの名無しさん
2008/08/24(日) 13:15:24> str=(char *)malloc(sizeof(char *)*(num+1));
これは
str=(char *)malloc(sizeof(char)*(num+1));
こうだろ。
0696デフォルトの名無しさん
2008/08/24(日) 13:16:41お前にmallocは1年早い
0697デフォルトの名無しさん
2008/08/24(日) 13:21:56!条件 は 条件==0 と同じ意味で、条件を0と比較したときに等しいと判断されるとき1を返す
ただし、必ずしも条件そのものが0であるわけではない(ヌルポインタ定数の問題)
0698デフォルトの名無しさん
2008/08/24(日) 13:27:50これは難しいですね
この場合 strが0じゃなくて strに何も入ってない strの[]が確保できなかったときに
エラー返すってことでいいんですか?
0699デフォルトの名無しさん
2008/08/24(日) 13:29:02本当にありがとうございました
0700デフォルトの名無しさん
2008/08/24(日) 13:32:523行目は余計だ。ヌルポインタは内部表現がどうであろうと、
Cの中では0だ。5.3、5.5とか見てみろ。
http://www.kouno.jp/home/c_faq/c5.html#3
0701デフォルトの名無しさん
2008/08/24(日) 13:35:04わかってないのはお前だ
>>697が言ってるのはまさにそのCFAQに書いてあることだろ
0702デフォルトの名無しさん
2008/08/24(日) 13:37:56ちがいます
Cの中ではヌルポインタの値がなんであるかは規定されていません
コンパイラが0をヌルポインタにするだけです
0703デフォルトの名無しさん
2008/08/24(日) 13:38:040704側近中の側近 ◆0351148456
2008/08/24(日) 13:43:42確かにANSIではNULLを0とせよとの記述はないが、
NULLが0でないコンパイラってあるのかな?
0705デフォルトの名無しさん
2008/08/24(日) 13:45:440706側近中の側近 ◆0351148456
2008/08/24(日) 13:46:17そうだっけ?
0707デフォルトの名無しさん
2008/08/24(日) 13:46:380708デフォルトの名無しさん
2008/08/24(日) 13:47:38だったらやっぱり普通にCで扱う限りはヌルポインタは0だろーが
0709側近中の側近 ◆0351148456
2008/08/24(日) 13:49:35まあ、こういう誤解を生むから
if(条件文)では、ちゃんと論理式を書くべきだね。
何でもかんでも略すカーニハンの悪い癖だ。
0710デフォルトの名無しさん
2008/08/24(日) 13:51:01str==0でいいのに
0711デフォルトの名無しさん
2008/08/24(日) 13:52:14「普通」ってなんのこと?
そういうのを放置するからmemsetでポインタにゼロを埋めるようなやつが出る。
0712側近中の側近 ◆0351148456
2008/08/24(日) 13:54:26確かに、
memset(&p, NULL, sizeof(p));
とやってる奴には、
お前、NULLって何だかわかって使ってるんだろうな?
と問い詰めたくなるね。
というか、警告レベルを上げれば警告が出るけどね。
0713デフォルトの名無しさん
2008/08/24(日) 13:55:27いや、NULLは処理系定義の空ポインタ定数なので、_Nullptrでもかまわないよ
0714側近中の側近 ◆0351148456
2008/08/24(日) 14:03:09というか、mallocが失敗した時に返す値をstrに入れないとダメだろ。
NULLの実体が0か否かに関係なく。
と言ってみる。
0715側近中の側近 ◆0351148456
2008/08/24(日) 14:11:57(っ´▽`)っは何を言ってるんだ?
0716デフォルトの名無しさん
2008/08/24(日) 14:17:22int main( int x , int y)とかってないんですか?
0717側近中の側近 ◆0351148456
2008/08/24(日) 14:18:30(っ´▽`)っ
int main(int argc, char *argv[])
で我慢しなさい。
0718デフォルトの名無しさん
2008/08/24(日) 14:18:51つargc, argv
0719デフォルトの名無しさん
2008/08/24(日) 14:21:29-helpとかですよね
側近中の側近さんは日常で使えそうなプログラムとか作れるんですか?
0720デフォルトの名無しさん
2008/08/24(日) 14:24:240721デフォルトの名無しさん
2008/08/24(日) 14:46:39ただどうたら どうたら 流して結局ソースコード見せてくれないのが落ちなんでそこまで期待してませんが。
その前で日本語を学べっていうやつって腹が立ちますね。だいたい伝わってるのに、日本語を学べとか喧嘩うってるんですか?
他のサイトみせて 夏休みの宿題が残ってるんですね、わかります とか適当に流して。
これくらいしってるならCO2削減の家計ソフトとか作ったりできそうですが。
0722デフォルトの名無しさん
2008/08/24(日) 14:48:080723デフォルトの名無しさん
2008/08/24(日) 14:49:10釣り乙。
0724デフォルトの名無しさん
2008/08/24(日) 14:49:47日本語わかるんなら、面白そうな小説のひとつくらい出してみろよ。
0725デフォルトの名無しさん
2008/08/24(日) 14:52:07みなさんが、どれほどすごいのか知りたいだけです。
この高度なスキルをいかしてどのようなことをしてるのかなど。
敷居の高いことを語りあってるから、ATMなど作ったりできるのかな?って思ってるだけです
それとC言語ではどういうものが作れるか知りたいです。
自動販売機などはC言語?よくわかりませんが、アセンブラでしょうか?
これは釣りではありません。
0726デフォルトの名無しさん
2008/08/24(日) 14:56:53べつにすごくないです。
ここの質問は、高度なスキルがなくても答えられるようなことばっかりだから。
0727デフォルトの名無しさん
2008/08/24(日) 15:01:55ホストのほうはCOBOLとか?
0728デフォルトの名無しさん
2008/08/24(日) 15:05:23_Nullptrってなんずら?
少なくともCには存在しないよ
0729デフォルトの名無しさん
2008/08/24(日) 15:11:09一番最近やったCの仕事は、医療関係の測定機器と通信してデータを管理するシステム。
ただ、ぜんぜん高度じゃなかったけど。
十数年前からあるシステムで当時は選択肢はCしかなかったのかもしれないけど、今となっては
スクリプト言語で作ったほうが楽なんじゃね? と思われるような感じだった。
0730デフォルトの名無しさん
2008/08/24(日) 15:14:34あるある。一から作り直した方がいいんじゃね系。
0731デフォルトの名無しさん
2008/08/24(日) 15:16:48初心者の私から見れば、十分高度だと思います。
通信ってソケットどうたらですよね
そういうC言語を熟知してる時点でうらやましいかぎりです
0732デフォルトの名無しさん
2008/08/24(日) 15:17:090733デフォルトの名無しさん
2008/08/24(日) 16:18:14ソースをみたければ宿題スレへどうぞ。
たまに神がソースをアップしています。
0734デフォルトの名無しさん
2008/08/24(日) 16:39:11C言語はコンピュータ制御で動くものなら何でも作れる。
いまどき自販機にアセンブラ使うバカはいない。
>>727
少なくとも俺の知ってるとこはCOBOL。
0735デフォルトの名無しさん
2008/08/24(日) 16:40:53ほー、自動販売機はC言語?
0736デフォルトの名無しさん
2008/08/24(日) 16:56:092000年以前 C言語
2000年〜 C言語による抽象データプログラミング、UML、Java
とあるね。
0737デフォルトの名無しさん
2008/08/24(日) 16:59:39PCも通信モジュールが手に入ってクラックする奴が出てきて全部の味を混ぜたり好きなだけ缶出したり出来るようになるんだろうなあ
0738デフォルトの名無しさん
2008/08/24(日) 17:00:18架空のキーワード
処理系はそういうことをしてもいいよという例えだろ。
0739デフォルトの名無しさん
2008/08/24(日) 17:02:30外野の想像だけど、その通信はCOMポートとか使ったもので、ソケット関係なくね?
0740質問です
2008/08/24(日) 17:11:15winでvb++使ってます。Cの知識がわずかばかりあるくらいです。
お願いします
0741デフォルトの名無しさん
2008/08/24(日) 17:13:380742740
2008/08/24(日) 17:14:33×vb
○vc
0743デフォルトの名無しさん
2008/08/24(日) 17:18:080744740
2008/08/24(日) 17:20:140745デフォルトの名無しさん
2008/08/24(日) 17:22:330746740
2008/08/24(日) 17:24:020747デフォルトの名無しさん
2008/08/24(日) 17:27:170748デフォルトの名無しさん
2008/08/24(日) 17:28:51ていうかCの質問?
0749740
2008/08/24(日) 17:29:240751デフォルトの名無しさん
2008/08/24(日) 17:32:100753デフォルトの名無しさん
2008/08/24(日) 17:41:18#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
char shiroutoharubydemotukatterottekotta[80];
if(argc != 2) return -1;
strcpy(shiroutoharubydemotukatterottekotta, "ruby -e\"Dir.mkdir('");
strcat(shiroutoharubydemotukatterottekotta, argv[1]);
strcat(shiroutoharubydemotukatterottekotta, "')\"");
system(shiroutoharubydemotukatterottekotta);
return 0;
}
0754721
2008/08/24(日) 19:28:38ネットワーク系のソケットってやつを学ぶのかそれとも、時計など、3分タイマーなどそういうのをやったほうがいいんでしょうか?
偉大な皆さんがやってきた順序を参考にしたいと思います。
私は、webサイト、入門書って順番です 3分タイマーやいろいろな物を作ってみたいと思います。
0755デフォルトの名無しさん
2008/08/24(日) 19:34:430756デフォルトの名無しさん
2008/08/24(日) 19:35:030757デフォルトの名無しさん
2008/08/24(日) 19:36:150758デフォルトの名無しさん
2008/08/24(日) 19:37:390759デフォルトの名無しさん
2008/08/24(日) 19:59:280760デフォルトの名無しさん
2008/08/24(日) 20:09:090761デフォルトの名無しさん
2008/08/24(日) 20:18:07進路による。
組み込み系なら簡単なアセンブラとコンパイラの挙動の理解。
ウェブ系ならTCP/IPと、他の言語(perl,PHP,Java)、DBとの連携、
ゲームやビジネスアプリの制作ならC++を覚えるといい。
>>760
コンパイラの仕組みが理解できてないと、完全な理解は無理だよな。
0762デフォルトの名無しさん
2008/08/24(日) 21:26:23機械側はシリアルで出力してたけど、途中でアダプタかまして、IPに変換しえた。
0763デフォルトの名無しさん
2008/08/24(日) 22:18:33構造体とポインタを理解した?ご冗談を。
理解したつもりになってるだけだ。
ためしに、
「引数に構造体hogeのポインタを持ち、帰り値がintのポインタであるような関数へのポインタを
引数に持つ、char型16個の配列へのポインタを返す関数fooのプロトタイプ宣言」
を書いてみ。
0764デフォルトの名無しさん
2008/08/24(日) 22:20:040765デフォルトの名無しさん
2008/08/24(日) 22:20:060766763
2008/08/24(日) 22:23:040767デフォルトの名無しさん
2008/08/24(日) 22:24:500768デフォルトの名無しさん
2008/08/24(日) 22:28:11これであってる・・・はず
まあそれよりもテキスト操作を徹底的にやったほうがいいと思うけど
0769デフォルトの名無しさん
2008/08/24(日) 22:29:35、、、負け惜しみだけど。
0770デフォルトの名無しさん
2008/08/24(日) 22:34:52C++の関数ポインタに変わる機能はよくしらないが
速度が同じくらい出て簡単に書けるならいいけどな・・・
0771デフォルトの名無しさん
2008/08/24(日) 22:38:050772デフォルトの名無しさん
2008/08/24(日) 22:41:00アセンブラレベルで関数ポインターを考えるとあんまり早くする方法がなさそうなんだけどな・・・
switchに切り替えて処理が多い部分を先頭にもってくるというのは無しで考えると。
0773デフォルトの名無しさん
2008/08/24(日) 22:41:55受け渡したいメソッド(関数)を持ってるオブジェクト(のポインタ)を受け渡しするだけですよ。
速度面についてはコンパイラの最適化に期待。
0774デフォルトの名無しさん
2008/08/24(日) 22:44:47仮想関数使えってことじゃね?
速くはならないけど。
0775デフォルトの名無しさん
2008/08/24(日) 22:47:21分岐が数個程度なら、ifやらswitchのほうが速いかもしれない。
速くならないかもしれないけど。
0776デフォルトの名無しさん
2008/08/24(日) 23:05:35TRONの開発でもしてるんだろか。
0777デフォルトの名無しさん
2008/08/24(日) 23:06:170778デフォルトの名無しさん
2008/08/24(日) 23:09:250779デフォルトの名無しさん
2008/08/24(日) 23:09:29最近ここで質問してたx86エミュなんかだとシビアそうだな。
MIPSっていってたのでたぶんPSPで動かすんだろうけど。
0780デフォルトの名無しさん
2008/08/24(日) 23:12:430781721
2008/08/25(月) 00:03:59#include <stdlib.h>
#include <string.h>
void show(void);
void show1(void);
void show2(void);
int main(void)
{
void (*p[3])(void);
int num;
0782721
2008/08/25(月) 00:05:44p[1]=show1;
p[2]=show2;
printf("0,1,2\n");
scanf("%d",&num);
if(num>=0 && num<=2)
{
(*p[num])();
return 0;
}
}
void show(void)
{
printf("kuruma\n");
}
void show1(void)
{
printf("hune\n");
}
void show2(void)
{
printf("hikouki\n");
}
すみませんが関数ポインタはp[0]=show;
p[1]=show1;
p[2]=show2;
をやらないと呼び出せないんですか?
自分で p[3]=(show,show1,show2);などとやってみたんですが うまくいきません
もっと簡単にかけるやり方教えてください
0783デフォルトの名無しさん
2008/08/25(月) 00:08:140784デフォルトの名無しさん
2008/08/25(月) 00:10:160785デフォルトの名無しさん
2008/08/25(月) 00:11:310787721
2008/08/25(月) 00:22:16void (*p[3])(void);なんですが
void (*p[3]={show,show1,show2})(void);
では文法ミスで、void *p[3]={show,show1,show2}(void);とうってもエラーがでます。
(*p[num])(); の行がエラーがでますが、ここも変えるべきですか?
0788デフォルトの名無しさん
2008/08/25(月) 00:25:060789デフォルトの名無しさん
2008/08/25(月) 00:26:350790721
2008/08/25(月) 00:34:07やっとできました
(void) 引数を先にもってくるなんて思いつきませんでした。
(*関数ポインタ)(引数リスト);しか書いていなくて。
>788
788さんのやり方では、エラーがでました { }が色がつき文法エラーになりました
0791デフォルトの名無しさん
2008/08/25(月) 00:39:27の流れからすれば当然だろう
0792デフォルトの名無しさん
2008/08/25(月) 01:07:510793デフォルトの名無しさん
2008/08/25(月) 01:12:560794デフォルトの名無しさん
2008/08/25(月) 09:03:07マクロの内部で演算式で直接置き換えができない場合は
この戻り値を返すという直接的な指定は可能なんでしょうか?
0795デフォルトの名無しさん
2008/08/25(月) 10:18:19カンマ演算子を使えば、何とかなることもある。
0796デフォルトの名無しさん
2008/08/25(月) 18:20:490797デフォルトの名無しさん
2008/08/25(月) 18:31:460798デフォルトの名無しさん
2008/08/25(月) 18:45:11ライブラリが揃ってれば開発速度はどっちでも変わらん。
動作速度は、C++で何度もコンストラクタを呼び出したりしてると遅くなるが、そんなことしないからたいして変わらん。
0799デフォルトの名無しさん
2008/08/25(月) 19:53:20Cなら必然的に後者になる
気がする
0800デフォルトの名無しさん
2008/08/25(月) 20:56:53面倒だしな>Cで開発する場合
0801側近中の側近 ◆0351148456
2008/08/25(月) 20:59:44関数ポインタを使って、擬似的にオブジェクト指向☆
0802デフォルトの名無しさん
2008/08/25(月) 21:40:03コンパイラの中の一機能であるリンカが、リンケージしてる対象って何なのでしょうか?
ソースコードと実行ファイルをリンケージする事に何か意味があるのでしょうか?
それともまったく別のものms_dosとかとリンケージしているのでしょうか?
0803側近中の側近 ◆0351148456
2008/08/25(月) 21:41:30(っ´▽`)っ
リンケージしてる対象:.oファイル
0804デフォルトの名無しさん
2008/08/25(月) 21:42:080805側近中の側近 ◆0351148456
2008/08/25(月) 21:43:26.cファイル
↓コンパイル
.oファイル
↓リンク
実行ファイル
0806デフォルトの名無しさん
2008/08/25(月) 21:43:370807側近中の側近 ◆0351148456
2008/08/25(月) 21:45:29unix派は少ないのか・・・。
0808デフォルトの名無しさん
2008/08/25(月) 21:50:23ソースファイルをコンパイルすると>>803のいうように.oになるんだけど
ソースが複数存在する場合なんかは互いの関数のバイナリーレベルの
相対的な位置やexternなんかで参照してるエリアの位置も確定しないので
すべて.oにし終わった段階でリンクさせるのがリンカーのおしごと
別にソースでやってるわけじゃない
あれは単なる指示書だし
0810デフォルトの名無しさん
2008/08/25(月) 22:19:520811デフォルトの名無しさん
2008/08/25(月) 22:23:24>>807
どれがunixでどれがwin相当なのでしょうか?
0812側近中の側近 ◆0351148456
2008/08/25(月) 22:25:02(っ´▽`)っ
unix(gcc)が.o
Win(VC+)が.obj
0813デフォルトの名無しさん
2008/08/25(月) 22:26:58どっちにしろオブジェクトの略称でoなだけかobjなだけかの違いだよ
0814デフォルトの名無しさん
2008/08/25(月) 22:28:450815デフォルトの名無しさん
2008/08/25(月) 22:31:05こりゃ大変だぞ
Windowsのアプリを作るのに、APIのソースコードのコンパイルからしなくてはいけない
0816デフォルトの名無しさん
2008/08/25(月) 22:32:03win32APIっていってもピンきりだけど・・・・
0817デフォルトの名無しさん
2008/08/25(月) 22:34:46ピンキリってのが良く分からないレベルです
C言語で簡単なアプリケーションが作れるくらいになればいいなと思ってるんですが
0818デフォルトの名無しさん
2008/08/25(月) 22:35:40win32APIっていったらwindows用に用意されてる機能でAPI公開してる
物は全部ってことだよ・・・?
0819デフォルトの名無しさん
2008/08/25(月) 22:39:190820デフォルトの名無しさん
2008/08/25(月) 22:40:12いまどきWinMainから作っている人っているのかな?
0821デフォルトの名無しさん
2008/08/25(月) 22:51:19そこからか… じゃあ
つ【win95APIバイブル1】
0822デフォルトの名無しさん
2008/08/25(月) 22:56:040823721
2008/08/25(月) 23:02:14あとwhile(*str)です これはよく意味が分かりませんが これも NULLに達するまでですか?
ke[i]!=ke[5];ってやってもなんかだめでしたけど
ソース
int kazoeru(char ke[])
{
int i,c;
c=0;
for(i=0; ke[i]!='\0'; i++)
{
c++;
}
return c;
}
演算子を詳しく教えてくださいお願いします。
0824デフォルトの名無しさん
2008/08/25(月) 23:06:50null文字に達するまでであってます
ke[i]!=ke[5];がだめとかいわれてもkeの中身なんて知らないし
0825デフォルトの名無しさん
2008/08/25(月) 23:07:30while(*str) の意味はこちらのページの最後の方で勉強をしてね。
0826デフォルトの名無しさん
2008/08/25(月) 23:09:340827721
2008/08/25(月) 23:12:44ありがとうございます
>>824 826
keは char str[100]; scanf("%s",str); kazoeru(str)です
0828デフォルトの名無しさん
2008/08/25(月) 23:16:49/*--- 文字列sの長さを調べる ---*/
size_t strlen(const char *s)
{
size_t len = 0;
while (*s++)
len++;
return (len);
}
0829デフォルトの名無しさん
2008/08/25(月) 23:17:12strlenって関数あるけど・・・
0830721
2008/08/25(月) 23:18:08入門書でstrlenの関数を作れと書いてあって
while(*str)などがでてきて
質問してみました。
0831デフォルトの名無しさん
2008/08/25(月) 23:25:32strが配列ならstrの最初の要素
while(*str)は*strが0と等しくない間繰り返すという意味
0832デフォルトの名無しさん
2008/08/25(月) 23:28:17CではNULLはポインタにのみ使うべきものだ
0833デフォルトの名無しさん
2008/08/25(月) 23:28:50while (*s++)
これですでに混乱するだろうね。
0834721
2008/08/25(月) 23:29:32while(*str) は 0と等しくない間繰り返すんですが
この0はNULL('\0)ととらえていいんでしょうか?
while(*str)
{
str++;
}
だとstr[1]になって
繰り返しが 0ではなくなって1になるのでストップしてしまうとおもうんですが
0835デフォルトの名無しさん
2008/08/25(月) 23:30:47はいはい半端な知識乙
せっかくNULLじゃそう噛み付く奴いるともってnull文字にしといたのに・・・
0836デフォルトの名無しさん
2008/08/25(月) 23:32:320837デフォルトの名無しさん
2008/08/25(月) 23:32:360838デフォルトの名無しさん
2008/08/25(月) 23:33:140 が'\0'であることは決まっているので大丈夫です
>>837
それはダメじゃね?
0839デフォルトの名無しさん
2008/08/25(月) 23:33:230840まつせ
2008/08/25(月) 23:34:16{
int a;
while(1){
printf("新しく日本語を追加してください\n");
printf("%s\n", jpn[1]);
scanf("%s",jpn[count]);
printf("新しく英語を追加してください\n");
scanf("%s",eng[count]);
printf("1個追加かんりょー\n\n");
count++;
printf("まだ追加しますか? (y / n) :");
a = getchar();
if(a == 'n'){
break;
}
}
if(count == 20){
printf("腹いっぱい\n");
return 0;
}
return count;
}
getchar関数が機能しません
詳しく教えていただきたいです
0841デフォルトの名無しさん
2008/08/25(月) 23:34:21お前は何を言っているんだ
0842デフォルトの名無しさん
2008/08/25(月) 23:36:32素直に一文字でもscanf+%sで取りましょう
0843721
2008/08/25(月) 23:36:45やっとわかりました
0='\0'ってことですか
while(*str)=for(i=0; str[i]='\0'; i++)
0ってstr[0]かとおもって混乱してしまいました。
0844デフォルトの名無しさん
2008/08/25(月) 23:37:04改行文字がバッファが残っていると思われる
getchar();
printf("まだ追加しますか? (y / n) :");
a = getchar();
としてみたらどうかな
0845デフォルトの名無しさん
2008/08/25(月) 23:37:43NULLはポインター関連で使ったほうがいいかな・・・
\0は文字の終わりを示す物で16進数だと0x00
strは文字列のさす位置を常に移動してて
while(*str)
の部分は
条件判断に分解すると
*str != 0x00 の間処理をしますってこと。
配列風に書くと場所を指すインデックス用のエリアが必要だけど
int index = 0;
while(str[index] != 0x00)
{
index++;
}
0846デフォルトの名無しさん
2008/08/25(月) 23:37:590847デフォルトの名無しさん
2008/08/25(月) 23:38:28getchかな?
0848デフォルトの名無しさん
2008/08/25(月) 23:40:42直前の scanf("%s",eng[count]); でたとえば "fuck"+Enter と入れたとする
するとコンピューターには "fuck\n" というデータが送られて
eng[count] には "fuck" が入り、'\n' は残ったまま取り込まれるのを待つ状態になる
次の a = getchar(); はこの '\n' を読んでしまっている
0849デフォルトの名無しさん
2008/08/25(月) 23:40:52とかで一行ずつとって、sscanf()とかatoi()で変換するようにしましょう。
scanf()はクセ強いだけで使えないから、学習しても時間のムダです。
0850デフォルトの名無しさん
2008/08/25(月) 23:42:31ありがとう
結構単純な違いでしたね
0851デフォルトの名無しさん
2008/08/25(月) 23:43:14まあ、入門書を書くような落ちこぼれプログラマもどきには無理な話か。
0852デフォルトの名無しさん
2008/08/25(月) 23:43:40むしろその方法はえらく半端な気が
バッファがのこらないことぐらいか?利点
0853デフォルトの名無しさん
2008/08/25(月) 23:45:08scanf()の喰い残した改行文字をgetchar()が喰っている。
0854デフォルトの名無しさん
2008/08/25(月) 23:45:31scanf()に比べたら、シンプルで移植性もあるよ。
0855721
2008/08/25(月) 23:45:52皆さんscanfダメといっていますが。
なんか入門書かって後悔します。入門書以外でどうやって学んだら良いんですか?
0856デフォルトの名無しさん
2008/08/25(月) 23:47:210857デフォルトの名無しさん
2008/08/25(月) 23:48:24「俺ってそろそろ上級者?」ってやつだけ移植性とか気にすればいい
0858デフォルトの名無しさん
2008/08/25(月) 23:49:27いきなり文字列の構造からはじめろと?w
0859まつせ
2008/08/25(月) 23:51:160860デフォルトの名無しさん
2008/08/25(月) 23:52:26どこの誤爆こて版ww
0861デフォルトの名無しさん
2008/08/25(月) 23:53:31入力は出力と比べてものすごく危険なんだよ。
メモリやアドレスの概念がしっかりしてないとひどいことになる。
そういうことも気にせずに、inとoutだから対にして教えとけ、
程度しか思いつかないからプログラマもどきなんだよ。
0862デフォルトの名無しさん
2008/08/25(月) 23:56:49なんか反応があった方がくんでる実感あるだろうし。
まあ正直そのくらいで飽きるやつはやらなきゃいいと思うがな。
0863デフォルトの名無しさん
2008/08/25(月) 23:57:160864デフォルトの名無しさん
2008/08/25(月) 23:57:48scanfは使えないなと、後でわかればいいだけの話
0865まつせ
2008/08/25(月) 23:59:09{
int i;
char ans[100];
int tokuten=0;
for(i=0;i<count;i++){
printf("%s を訳せ\n",jpn[i]);
scanf("%s",ans);
if(strcmp(ans,eng[i]) == 0){
printf("正解!\n\n");
tokuten++;
}
else{
printf("間違ってるよ\n");
printf("回答例 %s\n\n",eng[i]);
}
}
printf("終了\n");
return tokuten;
}
void original3(int tokuten ,int count)
{
printf("%d門中、%d門正解です。\n",count,tokuten);
printf("正解率%d%%\n\n",tokuten / count * 100);
}
次の質問
上と下の関数で、引数のcountって一緒じゃないんですか?
0866まつせ
2008/08/26(火) 00:00:110867デフォルトの名無しさん
2008/08/26(火) 00:00:17危険なscanfをわざわざ教える意味がない
0868デフォルトの名無しさん
2008/08/26(火) 00:02:03>>866
別物です
0869まつせ
2008/08/26(火) 00:02:570870デフォルトの名無しさん
2008/08/26(火) 00:04:11そりゃ新しく学ぶ人がいればループもするさ
どこのスレでも「wikiよめ」「ぐぐれ」とかありきたりな質問者に対する対応が
絶えないのと同じ。
ループするネタといえば、配列がポインターに成り下がるという件
0871デフォルトの名無しさん
2008/08/26(火) 00:06:12returnを明示する必要があるのはその関数などが
戻り値を返す場合。
void original3(int tokuten ,int count)
{
printf("%d門中、%d門正解です。\n",count,tokuten);
printf("正解率%d%%\n\n",tokuten / count * 100);
}
これは関数が戻り値を返さないvoid 型なんでreturnなくてもいい
数値を返したい場合は
int original3(int tokuten ,int count)
などに変更して
return 0;
とか書いてあげればOK
0872デフォルトの名無しさん
2008/08/26(火) 00:06:22まだ質問の意図がよくつかめてないが
グローバルに宣言するとか
0873デフォルトの名無しさん
2008/08/26(火) 00:11:01メモリ領域について、宣言した変数を格納するスタック領域とmallocなどでメモリを確保するヒープ領域なのですが、
この2つが確保しているメモリ領域で衝突しない方法ってご存知ですか?
あとstatic変数って多く宣言するとプログラムサイズも大きくなりますかね?
誰か詳しい人がいましたらお教えください。
0874まつせ
2008/08/26(火) 00:11:59まず、txtファイルから単語を読み込む
単語の追加をする
単語テストをする
正解数、正解率をだす
で、読み込むときに、main関数内でcountに単語数を代入しました
が、、、追加しても単語数が増えないのはなぜですか?
0875デフォルトの名無しさん
2008/08/26(火) 00:13:13>この2つが確保しているメモリ領域で衝突しない方法ってご存知ですか?
普通は衝突しないだろ。
staticをつけるとプログラム内部に固定で取られる。
staticなしだとスタックにとる。
0876デフォルトの名無しさん
2008/08/26(火) 00:15:52見るから完全版あげろ
0877721
2008/08/26(火) 00:16:03わかりますそれ、ぐぐれとか、これだから初心者はとか言われると初心者みたいな私はいらってきます。
ですが私は教えるといったら変数とかforとかだけですけど あははっははっは
これでもC言語の入門書4冊もってますが難しいです。
0878デフォルトの名無しさん
2008/08/26(火) 00:17:090879デフォルトの名無しさん
2008/08/26(火) 00:18:500880デフォルトの名無しさん
2008/08/26(火) 00:19:10> この2つが確保しているメモリ領域で衝突しない方法ってご存知ですか?
衝突はしない。
スタック領域もヒープ領域も無制限に取れるわけではなくて、領域の総サイズは決まっている。
> あとstatic変数って多く宣言するとプログラムサイズも大きくなりますかね?
ファイルサイズは大きくはならない。かな?
仮想メモリー上のサイズは当然大きくなる。
0881デフォルトの名無しさん
2008/08/26(火) 00:20:37main関数にあるものとorigiなんとか関数でのcountは
変数は別物なので、変更は反映されないんです
中身の数値が代入されて扱えるだけなんです
なのでreturn使ってがんばってください
もしくはグローバル変数で
0882まつせ
2008/08/26(火) 00:20:55#include<string.h>
#include<stdlib.h>
#include"binary_node.h"
int count; //単語数
int print_menu(void);
int load_dicdata(char *filename,char eng[][256],char jpn[][256]);
void print_array(char [][256],int);
struct node make_leaf(char *eng, char *jpn);
void print_leaf(struct node *leaf);
void make_tree(struct node *root, struct node *node);
void print_tree(struct node *root);
int store_dicdata(char *filename, struct node *root);
void original1(char [][256], char [][256], int *count);
int original2(char [][256], char [][256], int *count);
void original3(int tokuten, int *count);
struct node;
void main()
{
int menu_num;
char eng[20][256]; //英単語を格納
char jpn[20][256]; //英単語の対訳(日本語)を格納
struct node root = make_leaf("", "");
struct node leaf[20];
int i;
int data_num;
int tokuten=0;
0883デフォルトの名無しさん
2008/08/26(火) 00:23:1516進数を10進数に換算と違って計算しづらいです。
もしかすると早見表みたいなのが存在してたりします?
0884721
2008/08/26(火) 00:24:25ファイルオープンは本の最後らへんにあるから、最後に学ぶ物だと思うんですが。
ポインタの方が大事ですか?
最後に載ってる物の方が難しいと感じるんですが。
この掲示板の方がとても親切で本当にありがたいです。
0885まつせ
2008/08/26(火) 00:24:46{
menu_num = print_menu();
switch(menu_num)
{
case 1:
count = load_dicdata("dicdata.txt",eng,jpn);
if(count == -1) //ファイルの読み込みに失敗した場合
{
printf("読み込み失敗\n");
return;
}
printf("読み込み成功\n");
break;
case 2:
print_array(eng,count);
print_array(jpn,count);
break;
0886デフォルトの名無しさん
2008/08/26(火) 00:25:31fopenはポインタの概念を理解してないとイミフだよ?
0887デフォルトの名無しさん
2008/08/26(火) 00:25:478進数も16進数も兄弟みたなものだろ
プログラムをやって16進数になれてるからそう思うだけだ
0888デフォルトの名無しさん
2008/08/26(火) 00:26:39二進数にしてから直せばいいんじゃないか。
>>まつせ
うざいから長くなるなら、どっかロダにあげろ
0889デフォルトの名無しさん
2008/08/26(火) 00:26:57#include<penio.h>
int fuckup(){
anal.fuck(&pennis);
Destroy(anal);
};
0890デフォルトの名無しさん
2008/08/26(火) 00:31:5516進数の一桁=2進数の4bit
あとはわかるな?
0891721
2008/08/26(火) 00:32:16たしか fopenって*がついてましたね。
time *とか難しそう。
>>887
プログラムで16進数とか使えるんですが、使う機会ってあるんですか?
10進数を16進数に変換するツールとかで使ってそうですが
省略することによってメモリどうたらとかなんかメリットありますか?
0892デフォルトの名無しさん
2008/08/26(火) 00:34:48>プログラムで16進数とか使えるんですが、使う機会ってあるんですか?
>10進数を16進数に変換するツールとかで使ってそうですが
>省略することによってメモリどうたらとかなんかメリットありますか?
C言語やってる上ではプログラムの内容次第では16進数はあまり縁がないかもね〜
アセンブラ(つーかハンドアセンブル)やってると16進数と仲良くならないとやって
いけなかったので16進数で暗算できたりしたな〜
今は簡単な計算しかできない^^;
0893まつせ
2008/08/26(火) 00:35:320894まつせ
2008/08/26(火) 00:36:330895デフォルトの名無しさん
2008/08/26(火) 00:37:06キリのいい数字を覚える
10 8
100 64
1000 512
10000 4096
・・・・・
3571だと、3*512+64*5+8*7+1=913
0896721
2008/08/26(火) 00:40:17アセンブラは組み込みと聞きましたが、アセンブラとかやったことないし。
命令がなんかSQLみたいで難しそうです。
それとプログラマーに転職したいと思ってるんですが。
ここでは皆さんレベルが高いこといってて、入門書読んだくらいじゃプログラマーなんてできないでしょうか?
やっぱりそれぞれの作る場所によって、教えてくれるんですか?
プログラマーって内容がイマイチなので、入門書にでてくるようなことをやってソフトを作るのかそれとも、
社員の方と協力して作るんでしょうか? もしかしていきなり、医療の通信する物をつくってくださいとか
押し付けられて一人でつくるはめになったりするんでしょうか?もうさっぱりです。
0897デフォルトの名無しさん
2008/08/26(火) 00:41:550898デフォルトの名無しさん
2008/08/26(火) 00:45:46スタック領域とヒープ領域に関しては衝突しないということだったのですが、私が参考にしていたサイトでは
>スタックは高位のメモリアドレスから、低位に向かって伸び、ヒープ領域は逆に、低位から高位に向かって伸びて行くことに、注意して下さい。
>スタックとヒープは衝突する事もあり得ます。この場合プログラムは破壊されます。エラーも警告もなくコンパイルできるが、実行時に異常がでる時があります。
とあったのでmallocでメモリを多く確保し過ぎるとスタック領域の所までメモリが来てしまい衝突してしまうのかと思っておりました。
http://www1.cts.ne.jp/~clab/hsample/Point/Point19.html
ということはヒープ領域というのはどんだけ malloc でメモリを取ってもスタック領域分のメモリと衝突する事はないということでよろしいでしょうか?
0899デフォルトの名無しさん
2008/08/26(火) 00:46:41>> あとstatic変数って多く宣言するとプログラムサイズも大きくなりますかね?
>ファイルサイズは大きくはならない。かな?
>仮想メモリー上のサイズは当然大きくなる。
static の取り方によるんじゃないかな。
static int i;
static int j = 0;
static int k[10];
とかC言語仕様上ゼロクリアされるstatic領域ならstatic initializerでゼロクリアする
"コード"になるけど、
static int i = 1;
static int j[10] = {0,1,2,3,4,5,6,7,8,9};
とかなら、データ領域に 1,0,1,2,3,4,5,6,7,8,9 を"持っておいて"、同じく
static initializer内でmemcpy するようなコードになると思われる。
static でゼロ以外の初期値盛りだくさんだとコード増えるかも。
0900デフォルトの名無しさん
2008/08/26(火) 00:49:20そのメモリの概念はまさしく俺がハンドアセンブルしてたころの
PC9801とかだなあ・・・
あのころはスタックエリアはまさしくSSレジスタ(だっけ?)
がスタックの位置を管理しててpop push命令で位置が変わってた。
で、そのサイトのように確かにアドレスの上位から下位に向いて
使うんだわ。
で普通のヒープと呼ばれるアプリケーション用のメモリは下位のあいてる箇所から確保。
でもいまどきのwindowsとかのアプリであればそんなので衝突なんてありえないから
マイコンとかくらいじゃね?
0901デフォルトの名無しさん
2008/08/26(火) 00:50:39大きくなってワロス
0902デフォルトの名無しさん
2008/08/26(火) 00:54:03そりゃ8バイトx配列分だからなw
0903デフォルトの名無しさん
2008/08/26(火) 01:00:260904デフォルトの名無しさん
2008/08/26(火) 01:09:45>>900->>902 さん 回答ありがとうございます。
それでは static変数については 使い方次第でプログラムサイズは大きくなるということですね。
あとスタック領域とヒープ領域の衝突については昔のコンピュータであれば起こっていたが、windows のアプリであれば衝突は起こらないということですね。
ありがとうごいざいました。
0905デフォルトの名無しさん
2008/08/26(火) 01:44:32そういった便利な数の考え方があるんですね。
でも進数別早見表とか使ってる人もいるんじゃないかと思うのは邪推ですか?
0906デフォルトの名無しさん
2008/08/26(火) 01:47:19あと8進数と16進数は基本的に2進数にすぐに置き換わるので
ビットレベルで足し算すればすぐでしょ
0907デフォルトの名無しさん
2008/08/26(火) 01:58:360908デフォルトの名無しさん
2008/08/26(火) 01:58:500909デフォルトの名無しさん
2008/08/26(火) 02:01:23BSSセクション使ってくれないの?
0910デフォルトの名無しさん
2008/08/26(火) 02:03:30printf とか scanf はもっとイミフだよ
しょっぱなから出てくるけどw
0911デフォルトの名無しさん
2008/08/26(火) 03:11:07>>902
なんで、領域分exeが大きくなるんですか?わけわかりません
ためしに、コンパイルしてみましたがそんなに増えないです
なにかおかしいのでしょうか
0912デフォルトの名無しさん
2008/08/26(火) 03:18:20増えない処理系もあるよ
BSSを起動時にクリアする賢い処理系ならね
ただstatic領域と言っても初期化の値がゼロとは限らないから
大抵実行イメージ内にコピーを持ってて起動時に転送する
全部ゼロなら最適化してくれる処理系があるって事でしょ
0913デフォルトの名無しさん
2008/08/26(火) 06:36:12switchだと内部的にはif {} else if {] ・・・の繰り返しだと聞きますが
これだとムラがありますし、関数だと呼び出し戻りでコストがかかります。
0914デフォルトの名無しさん
2008/08/26(火) 06:58:46で、gotoのラベルは、テーブルに出来ない。
やるとしたらアセンブラレベルにするしかないね。
ところで、間接ジャンプは、分岐先が前回と同じでかつエントリに残っている、というケース以外
必ず分岐予測ミスになるって知ってた?
まあ、Pen4を前提とするとかでない限り、そんなに気にするもんでもないかもだけど。
0915側近中の側近 ◆0351148456
2008/08/26(火) 07:14:13(っ´▽`)っ
じゃあ、'\0'をなんと読むんだよ。
「ぬるもじ」じゃないのか?
0916デフォルトの名無しさん
2008/08/26(火) 07:33:21ナル文字。
>>912
static int foo[100]とstatic int foo[100] = {0}で違うセクションに配置されて違う初期化を行なわれる環境は多いね。
0917デフォルトの名無しさん
2008/08/26(火) 07:39:31NULL ヌルポインター
/dev/null ヌルデバイス
0918デフォルトの名無しさん
2008/08/26(火) 07:40:04「ぬるもじ」で構わないけど、「NUL」な。「NULL」じゃないぞ。
0919デフォルトの名無しさん
2008/08/26(火) 08:01:22null文字だぜ?
0920デフォルトの名無しさん
2008/08/26(火) 08:20:26━━ a. 無効の; 重要でない, 無価値[無意味]な; 存在しない; 【数】ゼロの; 【コンピュータ】ヌル, 空の.
null and void 【法】無効の.
━━ n. 【数】ゼロ.
null character 【コンピュータ】空文字.
null code 【コンピュータ】ヌル・コード.
null cycle 【コンピュータ】ヌル・サイクル.
nul・li・fy ━━ vt. 無効にする; 無価値にする; 取消す.
nul・li・fi・ca・tion n.
null instruction 【コンピュータ】空命令.
nul・li・ty ━━ n. 無効; 【法】無効なこと[物]; 皆無; つまらない人[物].
nullity suit 婚姻無効訴訟.
null list 【コンピュータ】空リスト.
null method 【工】零位法.
null modem (cable) 【コンピュータ】ヌルモデム(ケーブル).
null operation 【コンピュータ】空操作.
null set =empty set.
null string 【コンピュータ】空文字列.
0921デフォルトの名無しさん
2008/08/26(火) 09:00:46ありがとうございます。 一番しっくり来る考え方です。 HDDやメモリの計算でなれているからでしょうか?
>>906
>あと8進数と16進数は基本的に2進数にすぐに置き換わるので
ビットレベルで足し算すればすぐでしょ
すいませんできれば例題をお願いします。
俺の予想している計算法だとすると・俺の頭だとするとむしろ3bitと4bitを前提に計算すると余計計算が辛いのです。
8 64 512 を目安にした方が計算が楽なのは俺が10進法世界の住人属性を未だに強く持っているからでしょうか?
0922デフォルトの名無しさん
2008/08/26(火) 09:30:19頭の柔らかさの有無だろ。
8進は16進に変換した方が私も楽だな。
色を扱っていると17の倍数も覚えちゃうしね。
# 0x11(=17)、0x22、0x33、……0xff
# htmlの216色で使うのは0、0x33(=51)、0x66、0x99、0xcc、0xffの6階調。
0923デフォルトの名無しさん
2008/08/26(火) 09:34:59SOH ACK CAN NAK とかと同様に
0924デフォルトの名無しさん
2008/08/26(火) 10:05:03一時期EOSという呼び方があって良かったのだが廃れてしまったな。
「エンゼロ」とでも呼ぶのが良さそうだ。
0925デフォルトの名無しさん
2008/08/26(火) 10:11:03複数個の文字列を渡して、渡した先では変更しない場合、
宣言側で「char *var[MAX];」とかやってvar[0], var[1], ... にポインタを格納し、
関数fooを「void foo(const char** arg);」とか宣言して、実行箇所で「foo(var);」として、
gcc -Wallでコンパイルすると
passing argument 1 of 'foo' from incompatible pointer type
とかいう警告が出ます。
constを省略して「void foo(char** arg);」
とすると警告は消えますが、foo内でargは壊さないので、constを省略したくありません。
たぶんconstの場所が間違ってるんだと思いますが、正しい場所を教えてください。
0926デフォルトの名無しさん
2008/08/26(火) 10:13:30なるほど ただ8進数を16進数に変換ってどういう計算式になるんでしょう?
私にはどうも思いつかないです。
10進数から頭がはなられられないTT
0927デフォルトの名無しさん
2008/08/26(火) 10:17:29>8 64 512 を目安にした方が計算が楽なのは俺が10進法世界の住人属性を未だに強く持っているからでしょうか?
いや別に方法は人それぞれでいい気がするけど。
別に数学とかの問題で答えを導きだすとかそんなんじゃないんだし^^;
16進数だって10進数に変換する際は
16x16xa + 16xb + c
となるし
掛け算が面倒ならビットに分解して
ビットに当てはまる10進を足していけばいいだけ
1 2 4 8 16 32 64 128 ・・・・ なだけだしね
2進数に変換すると16進数も8進数も共通になるし
0928デフォルトの名無しさん
2008/08/26(火) 12:23:07ただm進のmm掛け算のテーブル(九九みたいな)とn一桁の数字のn→m変換のテーブルがないと手計算しんどい
たとえば8進03751→16進だったら
010^0 * 01 = 0x8^0 * 0x1 = 0x1 * 0x1 = 0x1
010^1 * 05 = 0x8^1 * 0x5 = 0x8 * 0x5 = 0x28
010^2 * 07 = 0x8^2 * 0x7 = 0x8 * 0x8 * 0x7 = 0x1C0
010^3 * 03 = 0x8^3 * 0x3 = 0x8 * 0x8 * 0x8 * 0x3 = 0x600
ぜんぶたして0x7E9みたいなかんじで
0929デフォルトの名無しさん
2008/08/26(火) 12:34:170930デフォルトの名無しさん
2008/08/26(火) 12:36:51010^1 = 0x8
010^2 = 0x40
010^3 = 0x200
010^4 = 0x1000
0x10^1 = 020
0x10^2 = 0400
0x10^3 = 010000
の方が変換しやすいってことだな
0931デフォルトの名無しさん
2008/08/26(火) 13:00:24一番左の式は 2進法の時の式ですか? 時々そんな式を見るのですが俺には良く分かりません
=が一回はさまれてから理解できます。
特にキャレット計算に挟む段階でちょっと基礎知識が足りないです。
0932デフォルトの名無しさん
2008/08/26(火) 13:16:48Cだと8進数は0123のように先頭に0をつけてあらわす
0933925
2008/08/26(火) 13:22:39925に答えてください。
0934デフォルトの名無しさん
2008/08/26(火) 13:25:21話長引かせてすいません。
俺には全然回答できないレベルなので返答もできなくてすいません。
でもできたらこっちもビットに分解とかのレスも欲しいです。
0935デフォルトの名無しさん
2008/08/26(火) 13:30:19でいいんじゃね?
0937デフォルトの名無しさん
2008/08/26(火) 13:47:10変数宣言を const char *var[MAX]; にする
char** → const char** の変換はできない
0938デフォルトの名無しさん
2008/08/26(火) 13:48:54下記はどちらが組み込まれますか?
#if 1
<hoge_a>
#else
<hoge_b>
#endif
下記は組み込まれますか?
#if 0
<hoge_c>
#endif
0939デフォルトの名無しさん
2008/08/26(火) 13:52:20「Cだと」と言ってしまうと、キャレット(^)をべきじょうの意味で使えなくなると思うが?
XOR演算してるわけじゃないだろ。
0940デフォルトの名無しさん
2008/08/26(火) 13:54:06それはクイズですか?
0941938
2008/08/26(火) 13:54:400942925
2008/08/26(火) 13:57:52おお、できました!!ありがとうございます!
const char *var[MAX]; として、 var[n] = "ABC"; とかはOKなんですね〜。
きっとvar[n][0]++;とかやると怒られるんでしょうね。
勉強になりました。
0943デフォルトの名無しさん
2008/08/26(火) 13:58:060944デフォルトの名無しさん
2008/08/26(火) 14:04:39上はエラー
#includeがあれば<hoge_a>が組み込まれる
下は組み込まれない
0945デフォルトの名無しさん
2008/08/26(火) 14:04:52俺が手でやれって言われたら2進を介するな。
03751 = 11,111,101,001(2進)
= 111,1110,1001(2進) = 0x7e9
0946デフォルトの名無しさん
2008/08/26(火) 14:27:01俺はやっぱり現在得意な方法でやった方がよさそうですね;
とりあえずcやる上でそんなに上の方に行かない限り現在のやり方で十分対処できそうだし。
てっきりはやみ表とかツール使うのが主流なものかと思ってましたよ。
皆さんちゃんと自前の頭で計算されてるんですね。
0947デフォルトの名無しさん
2008/08/26(火) 14:32:08自分で計算できても電卓の方が速い
0948デフォルトの名無しさん
2008/08/26(火) 14:36:25ttp://www.vector.co.jp/soft/win95/personal/se345870.html
とかもいい。
以前は関数電卓を横に置いて作業してたけど、もう↑で十分と思うようになった。
ビットのポチポチが楽しい
0949デフォルトの名無しさん
2008/08/26(火) 14:54:01ポチポチいいね
使わせてもらうよ
アイコンがださくて、速攻変えたけどw
0950デフォルトの名無しさん
2008/08/26(火) 15:02:160951デフォルトの名無しさん
2008/08/26(火) 16:13:40ありがたくいただきました
正直コンピュータにやらせられる事はなるべくやらせるべきですよね そもそも
人間が計算に煩わされないように開発されたものですし。
0952デフォルトの名無しさん
2008/08/26(火) 16:32:16http://wktk.vip2ch.com/vipper97786.png
http://wktk.vip2ch.com/vipper97787.png
http://wktk.vip2ch.com/vipper97788.png
0953デフォルトの名無しさん
2008/08/26(火) 16:38:05RPN電卓とかいうらしい。
http://wktk.vip2ch.com/vipper97792.png
0954デフォルトの名無しさん
2008/08/26(火) 16:58:52ぐぐると
エクスカリバーとかでてくるけど。
逆行列を計算したいだけなんだけどね
20x20の
0955デフォルトの名無しさん
2008/08/26(火) 17:09:390956デフォルトの名無しさん
2008/08/26(火) 17:29:17ubuntu,debianとかの方法がでてくるけども。
vineでもできるのかな?
0957デフォルトの名無しさん
2008/08/26(火) 17:44:110958デフォルトの名無しさん
2008/08/26(火) 17:46:25中見ると、Cray、GCC、Linux、Microsoft、OS2、RS6000、SGI、SPARC、ThinkC、TurboC、WatcomPC
に対応してるようだw
0959デフォルトの名無しさん
2008/08/26(火) 18:25:060960デフォルトの名無しさん
2008/08/26(火) 18:50:410961デフォルトの名無しさん
2008/08/26(火) 18:51:310962デフォルトの名無しさん
2008/08/26(火) 18:53:44行列計算ならlapack一択
0963デフォルトの名無しさん
2008/08/26(火) 19:51:28「変数宣言とmallocでのメモリ確保でスタック領域とヒープ領域がメモリ領域内で衝突しセグメントエラーにならないためには何に気をつけるべきか」
という課題を出されているのですが、コレって
ローカル変数の宣言ではstaticで宣言して変数を静的領域したり、
mallocでメモリ確保した場合は 処理が終わったらすぐに free で 解放する
ということでよろしいでしょうか? 他にもスタック領域とヒープ領域でメモリ領域を取り合いにならない方法はあるのでしょうか?
0964デフォルトの名無しさん
2008/08/26(火) 20:07:57すいません、そもそもヒープとスタックが衝突する状態ってのが想像できません。
0965デフォルトの名無しさん
2008/08/26(火) 20:15:43PCじゃなくて組み込みかなにかでしょうか?
0966デフォルトの名無しさん
2008/08/26(火) 20:20:35逆にヒープ領域とスタック領域が衝突しないという方が私には想像できません。
このサイトの真ん中あたりでも紹介しているようにスタック領域とヒープ領域を広げていてセグメントエラーを起こしております。
http://www.geocities.jp/sugachan1973/doc/funto44.html
0967デフォルトの名無しさん
2008/08/26(火) 20:28:360968デフォルトの名無しさん
2008/08/26(火) 20:30:01参照してるページが古すぎます。
仮想メモリの無い時代はそういう事もあったでしょうが、
現在では仮想メモリがハードでサポートされているため、
異なるセグメントが物理メモリ上で衝突することが無いように
OSによって管理されています。
0969デフォルトの名無しさん
2008/08/26(火) 20:41:150970デフォルトの名無しさん
2008/08/26(火) 20:41:59そんなことになる前にページ違反で落ちるから安心しろ
0971デフォルトの名無しさん
2008/08/26(火) 21:09:52そのサイトにあるプログラム実行してみたらわかるよ
今のOSだとスタックアドレス<ヒープアドレスだから衝突しない
普通スタックが無くなってエラーで終了
巨大な領域をmallocしたらmallocでNULLがかえるだけ
0972デフォルトの名無しさん
2008/08/26(火) 21:41:26「変数宣言とmallocでのメモリ確保でスタック領域とヒープ領域がメモリ領域内で衝突しセグメントエラーにならないためには何に気をつけるべきか」
A
スタック領域とヒープ領域は別になってるので衝突しません
スタックやヒープが足りなくなることはあります
0973デフォルトの名無しさん
2008/08/26(火) 21:59:15しかし、課題を与えている先輩に聞いた所、ヒープやスタックは同じメインメモリに格納されているので衝突するはずというお話なのですが、
今のOSって割り当てる領域は別になっているというコトでしょうか?
(ちなみにそのサイト2005年ですが、当時のPCは割り当てないということですか?)
ちなみに私、VCがないのでそのプログラム実行できません。すいません。
0974デフォルトの名無しさん
2008/08/26(火) 22:01:000975デフォルトの名無しさん
2008/08/26(火) 22:01:43その出題者ってどんだけ頭の中テムレイ状態なんだよwww
そんなの心配する必要があるのはPC9801シリーズのような
メモリが限られた環境だけだよww
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
ほれスタック管理してるセグメントレジスタの説明
0976デフォルトの名無しさん
2008/08/26(火) 22:02:280977デフォルトの名無しさん
2008/08/26(火) 22:31:23とか
・ヒープを使いすぎない
とかでいいんじゃないの。
0978デフォルトの名無しさん
2008/08/26(火) 22:36:41それ完全にハード依存
0979デフォルトの名無しさん
2008/08/26(火) 22:37:040980デフォルトの名無しさん
2008/08/26(火) 22:39:260981デフォルトの名無しさん
2008/08/26(火) 22:43:00以前このスレでスタック食いつぶしてフリーズしてハマってる奴が来てたな。
そりゃスタックにdoublex10000超える配列入れれば・・・
そういうの以外まず衝突はありえんけどなあ。
0982デフォルトの名無しさん
2008/08/26(火) 23:12:200983デフォルトの名無しさん
2008/08/26(火) 23:18:51そのサイトにのっている「セグメントエラー」は、スタック領域とヒープ領域の衝突でなくて
スタック領域をこえたことによるオーバーフローではないかと思う。
0984デフォルトの名無しさん
2008/08/26(火) 23:23:120985デフォルトの名無しさん
2008/08/26(火) 23:24:36いやセグメントの概念をやかましくいうのは8086モード下くらい。
それ以外のCPUってそんな面倒な概念あんまりないやろ。
特に最近のは・・・
>>984
よろしこ
0986デフォルトの名無しさん
2008/08/26(火) 23:28:39そのセグメントでなくて、Segmentation Fault
0987984
2008/08/26(火) 23:30:590988デフォルトの名無しさん
2008/08/26(火) 23:31:200989デフォルトの名無しさん
2008/08/26(火) 23:35:44やってみるとどぅ改行すればいぃかわからん。。。。
エンター押すとわけのわからないものが・・・・orz
0990デフォルトの名無しさん
2008/08/26(火) 23:36:230991デフォルトの名無しさん
2008/08/26(火) 23:38:40C言語なら俺に聞け(入門篇) Part 35
C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題を片付けます 115代目
http://pc11.2ch.net/test/read.cgi/tech/1217741118/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 34
http://pc11.2ch.net/test/read.cgi/tech/1218532990/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0992デフォルトの名無しさん
2008/08/26(火) 23:44:54http://pc11.2ch.net/test/read.cgi/tech/1219761846/
0993デフォルトの名無しさん
2008/08/26(火) 23:46:12乙
ありがとう
0994デフォルトの名無しさん
2008/08/26(火) 23:49:58今思えば無駄に大変だったな
0995デフォルトの名無しさん
2008/08/26(火) 23:52:41今思うと、IntelとMSにいいように引っ掻き回されていたということだな。
0996デフォルトの名無しさん
2008/08/27(水) 00:00:060997デフォルトの名無しさん
2008/08/27(水) 00:08:270998デフォルトの名無しさん
2008/08/27(水) 00:09:540999デフォルトの名無しさん
2008/08/27(水) 00:22:29ってどんな感じですか?
うめ
1000デフォルトの名無しさん
2008/08/27(水) 00:24:2810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。