C言語なら俺に聞け(入門篇) Part 47
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/03/27(金) 02:16:57初心者、初級者の方は他の質問スレのほうが良いかもしれません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 124代目
http://pc12.2ch.net/test/read.cgi/tech/1235927586/
もしくは
C/C++の宿題片付けます 125代目
(現時点でまだ立っていません)
・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 46
http://pc12.2ch.net/test/read.cgi/tech/1235918203/
過去スレ
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デフォルトの名無しさん
2009/03/27(金) 02:24:390003デフォルトの名無しさん
2009/03/27(金) 02:39:24ttp://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B7%E3%82%A2
ユーラシア大陸の広範囲を領土とする国の人口をご覧頂こう。
それでも中国は建前でも10億以上。もっとも、正確な調査のもとで得られた報告かは知らんが。
地球上に60億人はいるとされる人間。6人に1人は中国人?母国語以外に
英語をマトモに話せる人がどれだけいると?今やネットでは英語は普通に見かけるが
日常会話でマトモに使える人がどれほどいるか?しかし、全く知らない人は少ないだろう。
ttp://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%8A%E3%83%80
ttp://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%AE%E3%83%AA%E3%82%B9
ttp://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%AA%E3%82%A2
これらの国々の人口を合わせても・・・一部は、移住してきた民族が多くを占める州もある。
これらをもとに、果たして英語が一番使われている言語と言えるのだろうか?
0004デフォルトの名無しさん
2009/03/27(金) 02:52:00まずお前の日本語をなんとかしてくれ。
0005デフォルトの名無しさん
2009/03/27(金) 02:54:05ましてCに関係のある話ではありえない
0006デフォルトの名無しさん
2009/03/27(金) 02:56:130007デフォルトの名無しさん
2009/03/27(金) 02:56:21そして、何かと数学では話題になるインドも10億以上。
確かに英語は日常的に使われる。しかし、用いている人が
日常会話で使っているだろうか?Can you make yourself understood in English?
0008デフォルトの名無しさん
2009/03/27(金) 03:00:26こちらを先に出しておくべきだった。まぁ、そういうことで、プログラム言語で
英語を使っているからって視野が狭くなってはいかんよ、ワトソン君。
プログラミングに於いても柔軟な考え方は必要だよ?思い込みや一方向から
物事を見るだけでは不十分なのですね、ポワロ殿。そうさ、ミス・レモン。
0009デフォルトの名無しさん
2009/03/27(金) 07:16:060010デフォルトの名無しさん
2009/03/27(金) 10:13:03つか使ってる人の数の多さよりも
使ってる文字の少なさの方が重要だと思うけど
0011デフォルトの名無しさん
2009/03/27(金) 12:09:580012デフォルトの名無しさん
2009/03/27(金) 14:19:370013デフォルトの名無しさん
2009/03/27(金) 18:47:05自作しかない?
0014デフォルトの名無しさん
2009/03/27(金) 20:18:38srand(5000)のとき黒が(5,6)に打ったあと発生。
白手番だが、次々手番で打つ場所がなくなるため評価値がINT_MINになる。
次のifが(cur>max)と">"なので、その座標がmainに帰されず、前回の黒手番と同じ座標に打とうとする。
cur>=maxにすればとりあえず回避はできる。(ただしmin-max法としては間違っている。)
1)min-max計算中にもパス判定が必要
2)相手が打てなくなってもそれが最良手とは限らない
0015デフォルトの名無しさん
2009/03/27(金) 23:49:17それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。
C言語は上から順番に処理されるんだよね。
そうすると、割り込むみたいなことは許されないんだよね?
例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理?
for( )
・・・・・・・・・
if(getchar
見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、
その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
0016デフォルトの名無しさん
2009/03/27(金) 23:51:31うるせえよ
3つものスレにマルチしてんじゃねーよ
0017デフォルトの名無しさん
2009/03/27(金) 23:51:45_beginthreadex
0018デフォルトの名無しさん
2009/03/27(金) 23:57:160019デフォルトの名無しさん
2009/03/28(土) 00:11:47_kbhit()
0020デフォルトの名無しさん
2009/03/28(土) 01:00:08あぁ、日本語が通じない馬鹿か、失せろ。お前の知能をどうにかしろw
お前が理解できないのは日本語もそうだが、内容もだろ?
そう、言葉は意味を理解してこそ理解に繋がる。
意味も知らずに子供が罵詈雑言や下品な言葉を使うのは、相手の反応で
楽しんでいることもあるが、大人になろうがそうでなかろうが、意味が理解できる人で
まともな知性の人は、まずお前みたいな稚拙な反応はしない。
0021デフォルトの名無しさん
2009/03/28(土) 01:04:30失せろゴミ
0022デフォルトの名無しさん
2009/03/28(土) 01:05:31wiki貼り付けるだけのアホは日本語すらまともに使えてないがw
↑こいつはwikiの内容が事実無根と言いたいんだろうけど、中には
主観的なことを書いている奴もいるからな。あくまでも参考までにだ。
事実無根、反することがあれば、どうぞそれに対して指摘をどうぞ。
とにかく、この世の人口なんて統治されていない国、紛争地帯では
実態が把握し辛いのが現状。自分が知った、思ったことが真実だと思うなってことだ。
で、英語が一番?だと思いたいんでしょ。母国語としてという話ではなくても
自分も英語圏以外の人と話すときは、何かと英語が用いられるけどな。
もう10年以上、大学の専攻分野の関係上、インターネットを使い続けているが
アクセス制限をしていないのであれば、国境のない世界に、今こうして我々が
日本人が多く集まるコミュニティーで日本語を当たり前に見かけるとは言え
表示できる文字もPCの環境で違うとはいえ、PCの基本部分は何かと英語が
使われているからね・・・
0023デフォルトの名無しさん
2009/03/28(土) 01:10:17ご自分はどうなの?間違った言葉は一度も使ったことがない?
結局、思想にまで話が及ぶから、それ以上言いたくないんだろ?
そう、言葉には人間性が露呈していますからね。お前みたいに
まともに使えないと相手を見下す言動を平気でする。
そもそも、こんな場所に畏まった、出版するような文章の記述をしろと?
0024デフォルトの名無しさん
2009/03/28(土) 01:13:490025デフォルトの名無しさん
2009/03/28(土) 01:13:53使っていないんだな。孤立しちゃったタイプ?そういうのは必ずと言って良いほど
情報弱者とも言える発言をするよね。独りよがり。別に自分に対して直接
話を掛けてこられたわけでもないのに、何かと気に入らないものを見ては
それに対して反発したり、物申したりする。あんたがどこの誰かなんて俺は知らない。
逆に、あんたも俺のことは知らないだろう。もしかすると、たまたま過去の知り合いだったら
それはそれで面白いが、2ちゃんねるなんて不特定多数の人が来る場所だしね。
オフで会う人もいるしね。けど、俺はお前を知らない。戸籍があり特定できる個人だろうと
世間一般では知られていない人は多い。お前、どこに誰が住んでいるか事細かに知っているの?
それはそれで、ある意味ストーカーよりすごいだろうね。
0026デフォルトの名無しさん
2009/03/28(土) 01:21:45スレ違いだというまっとうな指摘には一切反応しないのも昔っから
0027デフォルトの名無しさん
2009/03/28(土) 01:22:08あんた個人を特定して読めとも指図、強要はしていない。しかし、こちらも
間違っていない事実を述べているのに、それに対して反論されたらどうにもならん。
資料を提示しても、その資料が捏造だって言い出すんだろう?
では、捏造だという証拠を提示し賜え。自分がそう思わない=捏造とは限らんよ。
また、捏造した場合、事実無根の内容として後で判明するだろう。
そもそも、ここはワープロソフトに記述している正式な文章でもない。
形式ばったものしかこの世には存在しないとでも?
0028デフォルトの名無しさん
2009/03/28(土) 01:36:22不適切でもない部分を指摘してしまった時、自分の立場が悪くなるんだよね。
ありがち。前に句読点について指摘されたことがあるが、ではどこが?と訊ねたら
間違いではない箇所を指摘して墓穴を掘った人がいて、その後そいつは
何も言い返してこなくなった。自分が気に入らないだけでしょ?
間違いがあるなら、それは基準があってこそ。その基準が自分では曖昧。
客観性のある基準を提示すべき。要は目立つ奴が気に入らないんだろ?
こちらは名無しで別にコテハンを名乗ってないんだから、目立たない無名だよ?w
高学歴だろうと全知全能で森羅万象を知り尽くした人などいない。限りある命、己も
この世の一部のみを知り、そして後世に受け継ぐ。しかし、知らなくても良いことはある。
そう思うのもまた自分だ。知らないくせに知ったような口を聞いていると分かるのは、
真実を知っている人。資料を提示しても、それすら信用しないなら、もう何も信じるな。
己のみを信じろ。最後は孤立するだろう。
0029デフォルトの名無しさん
2009/03/28(土) 01:42:011行=100%、2行=100%、 5行=30%、 10行=0.1%
0030デフォルトの名無しさん
2009/03/28(土) 01:47:480031デフォルトの名無しさん
2009/03/28(土) 01:55:12ここは笑うところ?
0032デフォルトの名無しさん
2009/03/28(土) 02:35:33よくありがちなWindows用のプリンタは偽物である。
それらは全て偽物である。
本物のプリンタとは *Linux* で使えるポストスクリプトプリンタの
ことである。
0033デフォルトの名無しさん
2009/03/28(土) 03:26:440034デフォルトの名無しさん
2009/03/28(土) 03:30:58例えばCANON PIXUS iPシリーズはMac用のドライバも出てる
0035デフォルトの名無しさん
2009/03/28(土) 04:02:180036デフォルトの名無しさん
2009/03/28(土) 04:14:25世界的には日本語を使う人よりも英語を使う人の方が多い
前スレのこいつが必死なんだろ。日本語よりと比較したら間違いでもないんだが。
0037デフォルトの名無しさん
2009/03/28(土) 07:22:59>間違い、不適切な箇所があるなら指摘し賜え。
つhttp://mira.fc2web.com/n-manner_2.html
0038デフォルトの名無しさん
2009/03/28(土) 08:00:031行、2行でも長文に挟まれたレスはとばしてしまう
0039デフォルトの名無しさん
2009/03/28(土) 12:40:420040デフォルトの名無しさん
2009/03/28(土) 12:43:020041デフォルトの名無しさん
2009/03/28(土) 13:52:18printf("%p",&a)
結果↓
0Xbfff30ca
こんなかんじで
1Gのメモリ積んでるPCでも
2Gのメモリ積んでるPCでも
アドレス番地が4バイト分で表示されるのは
なぜなんでしょう?
実際はそんなにないはずですよね?
0042デフォルトの名無しさん
2009/03/28(土) 13:58:43だから問題ないと思うが
0043デフォルトの名無しさん
2009/03/28(土) 14:03:45>0xbfff30ca
2Gしか積んでいないのだから0xbfff30caなんてアドレスは存在しないと言いたいのでしょう。
簡単に言うと仮想アドレスだからです。
004441
2009/03/28(土) 14:14:37物理メモリとか仮想メモリとか
HDDへスワップさせるとかこういうことだったんですね。
理解が深まりました。
0045デフォルトの名無しさん
2009/03/28(土) 14:16:080046デフォルトの名無しさん
2009/03/28(土) 16:31:090047デフォルトの名無しさん
2009/03/28(土) 19:22:04生活スタイルから何まで、集団の中に似た人はいても全員に共通しているわけでもない。
ましてや世界レベルとなれば、同じ国でも地域によってかなり異なることも。
英語が一番?やはりメリケンに洗脳されたか?
あちらは今や、黒人初の大統領。しかし、島国日本に近いのはユーラシア大陸だぞ?
南米のブラジルは言うまでもなく公用語は英語ではないよ?
ただ、どこの国でもPCの基本部分は何かと英語が用いられているようでw
しかし、それはあくまでも日常生活、会話での話ではないんだよ、ホームズ殿。
知らない人からしてみれば、もはや文字、言葉とかではなく記号のようなもの。
0048デフォルトの名無しさん
2009/03/28(土) 19:49:260049デフォルトの名無しさん
2009/03/28(土) 19:56:140050デフォルトの名無しさん
2009/03/28(土) 20:03:44そんなこと言ったって、またうざいレスが返ってくるだけだからスルーしろ。
0051デフォルトの名無しさん
2009/03/28(土) 22:36:43void make4digits(int x[])
{
int i, j;
for (i = 0; i < 4; i++) {
do {
x[i] = rand() % 10;
for (j = 0; j < i; j++)
if (x[i] == x[j]);
break;
}while (j < i);
}
}
4つの異なる数字を並べる関数なのに開始すると同じ数字が
出てきて困る。一体何なんだろう?
0052デフォルトの名無しさん
2009/03/28(土) 22:40:19< -> <=
< -> <=
0053デフォルトの名無しさん
2009/03/28(土) 22:41:280054デフォルトの名無しさん
2009/03/28(土) 22:42:45; がいらない
0055デフォルトの名無しさん
2009/03/28(土) 22:43:41疑似乱数
srand
0056デフォルトの名無しさん
2009/03/28(土) 23:02:32バグの発生を抑えたいなら
0057デフォルトの名無しさん
2009/03/28(土) 23:17:15>>56
ありがとうございますた。集中力がなさすぎだな
0058デフォルトの名無しさん
2009/03/28(土) 23:28:16付けられると訂正する
※検証結果は後述
ただMSDNでは以下のように記述されている
ttp://msdn.microsoft.com/ja-jp/library/caaw7h5s.aspx
The address-of operator can only be applied to variables with fundamental, structure,
or union types that are declared at the file-scope level, or to subscripted array references.
MSDN ライブラリ Visual Studio 6.0
アドレス演算子を使えるのは、ファイル スコープ レベルで宣言されている基本型、構造体型、
共用体型の変数、または添字付きの配列参照に限られます。
0059デフォルトの名無しさん
2009/03/28(土) 23:31:58#include <stdio.h>
void main()
{
char ac[10];
char *pc1;
char (*pc2)[10];
pc1 = ac;
pc2 = ∾
printf("%p %p\n", pc1, pc2);
}
・実行例
0012FF78 0012FF78
&無しと&付きは共に配列の先頭アドレスを指すのだが
何が違うかといえば「データ型」が違う
0060デフォルトの名無しさん
2009/03/28(土) 23:41:10#include <stdio.h>
void main()
{
char ac[16];
char *pc1;
char (*pc2)[16];
pc1 = ac; pc2 = ∾
printf("%p %p\n", pc1, pc2);
pc1++; pc2++;
printf("%p %p\n", pc1, pc2);
}
・実行例2
0012FF74 0012FF74
0012FF75 0012FF84
ポインタをインクリメントしてみるとデータ型の違いが明らか
0061デフォルトの名無しさん
2009/03/29(日) 00:08:35pc1 = ∾ pc2 = ∾
warning C4047: '=' : 間接参照のレベルが 'char *' と 'char (*)[16]' で異なっています。
warning C4048: 'char (*)[32]' と 'char (*)[16]' で配列の添字が異なります。
・実行結果
0012FF74 0012FF74
0012FF75 0012FF94
ソースを少しいじってみたが警告は出るもののコンパイル可能
特にchar*への代入は&無しでも&付きでもアドレス自体は同一で
挙動にも異常はないため「&あってもなくても同じじゃん」と認識されるやもしれぬ
0062デフォルトの名無しさん
2009/03/29(日) 00:32:500063デフォルトの名無しさん
2009/03/29(日) 00:51:10pc1 = (char*)∾
は厳密に言えば正しくないのだが、警告も出ず正しく見えてしまう罠
0064デフォルトの名無しさん
2009/03/29(日) 02:38:16配列→ポインタの読み換え
式の中では、配列は「先頭要素へのポインタ」に読み換えられる。
int a[10];
の時、式の中では、a と &a[0]は同じ意味となる。
ただし、以下の個所は例外である。
1.sizeof演算子のオペランド
sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。
2.& 演算子のオペランド
& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、 & 演算子のオペランドにはならないはずであるが、
この例外規則のため、 & でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある (例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても
正常に動いてしまう(正常に動いたように見えてしまう)が、 メリットは今ひとつわからない。
3.初期化時の文字列リテラル
char の「配列」を初期化する場合の文字列リテラルは、 中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。
0065デフォルトの名無しさん
2009/03/30(月) 16:10:360066デフォルトの名無しさん
2009/03/30(月) 18:38:35参考になるサイト:http://pc11.2ch.net/test/read.cgi/gamedev/1141126812/
要は板違い。
0067デフォルトの名無しさん
2009/03/30(月) 19:59:370068デフォルトの名無しさん
2009/03/30(月) 21:18:12Service Description Language
Microsoft社が提唱していた、Webサービスの機能を記述する言語。
引数・戻り値・処理内容などを記述する、XMLベースの言語である。現在はSCLに吸収され、さらにSCLはWSDLに吸収されている。
…初めて聞いたけど、XMLベースならとにかくC系言語ですらなさそうだな。
0069デフォルトの名無しさん
2009/03/30(月) 21:19:48SDLでググって一番上みれ
0070デフォルトの名無しさん
2009/03/31(火) 01:10:13じゃあSDMLじゃないのかという突っ込みは無し。
0072デフォルトの名無しさん
2009/04/01(水) 01:07:27解析をしていまいちピンとこなかったので。
SIGNALKIND Kind;
PROCESS PId;
unit16 Chcnt;
上記の三つの変数はtypedefで作成した型です。
実際はSIGNALKIND=unsigned long、PROCESS=unsigned long、
unit16=unsigned shortです。なぜ、わざわざこのようなことをするのでしょうか?
実際ソースではシグナルの構造体のメンバの一つとしてに使われております。
typedef struct Request_Signal
{
SIGNALKIND Kind;
PROCESS PId;
unit16 Chcnt;
}Request_Signal;
よろしくお願いします。
0073デフォルトの名無しさん
2009/04/01(水) 01:11:49組み込み型にtypedef する理由は
分かりやすくする、後で実際の型を変更できる
というのがあります
0074デフォルトの名無しさん
2009/04/01(水) 01:20:25>>73の説明で良いだろうが、要は#define MAX_NUM (100)とかするのと同じ発想。
007572
2009/04/01(水) 01:24:18早速のレスありがとうございます。
今度、自分も型を作成し構造体を定義しなければならないのですが、
どのようなことを考慮して定義すべきでしょうか?
実際、定義すべき構造体は、
用途:文字データ送信のシグナル構造体
メンバ:データの種類・データ文字数・文字データ
0076デフォルトの名無しさん
2009/04/01(水) 01:30:32実際のデータ型を隠蔽するのが目的だから、メンバの意味を表現する型名として、
またそこに入れる値もなるべくならenumか#defineでシンボル化する
あとは名前空間を汚染しないようにすること
007772
2009/04/01(水) 01:38:56ありがとうございます。
>実際のデータ型を隠蔽するのが目的だから
ということは、構造体定義ヘッダと型定義ヘッダは分けたほうがよいのでしょうか?
そういう話ではない?
0078デフォルトの名無しさん
2009/04/01(水) 07:43:110079デフォルトの名無しさん
2009/04/01(水) 09:15:32forを使って%cで一つずつhenkan[5]の中身を出力すると上手くいくのに、
それ以外だと " ollehフフフフフフフフフフフhello "と出力されてしまい上手くいきません。
何が原因なんでしょうか?
#include <stdio.h>
main () {
int i,j=4;
char mojiretu[] = "hello";
char henkan[5];
printf("mojiretu = %s\n",mojiretu);
printf("文字を変換します\n");
for( i=0; i<=4;i++,j--) {
henkan[j] = mojiretu[i];
}
for( i=0;i<5;i++){
printf("%c",henkan[i]);
}
printf("\n\n");
puts(henkan);
return 0;
}
0080デフォルトの名無しさん
2009/04/01(水) 09:28:36mojiretu[1]='e';
mojiretu[2]='l';
mojiretu[3]='l';
mojiretu[4]='o';
mojiretu[5]='\0';
henkan[0]='o';
henkan[1]='l';
henkan[2]='l';
henkan[3]='e';
henkan[4]='h';
char henkan[6]; と宣言し
henkan[5]='\0'; が必要
0081デフォルトの名無しさん
2009/04/01(水) 09:29:08henkanが '\0' 終端していない。
0082デフォルトの名無しさん
2009/04/01(水) 09:30:47変換先の文字配列のhenkanが終端文字でターミネイトされていないから。
henkanの5番目の要素はそのプログラムでは未初期化。
0083デフォルトの名無しさん
2009/04/01(水) 09:32:52>>80の言う通りhenkanは6要素必要だ。
0084デフォルトの名無しさん
2009/04/01(水) 09:39:34#include <stdio.h>
#include <string.h>
int main()
{
char mojiretu[] = "hello";
char henkan[256];
int len;
int i;
printf("mojiretu = %s\n", mojiretu);
len = strlen(mojiretu);
for (i = 0; i < len; i++) {
henkan[len - 1 - i] = mojiretu[i];
}
henkan[len] = '\0';
printf("henkan = %s\n", henkan);
return 0;
}
008579
2009/04/01(水) 09:43:37ありがとうございました。
0086デフォルトの名無しさん
2009/04/01(水) 12:44:45文字列の中から特定の単語を検索するようなものを作ったんですが、上手くいかないんです。
検索する文字列と単語を日本語でなくって英数字にすると上手くいくんですけど
どうしたらいいのでしょうか?
#include <stdio.h>
#include <string.h>
main () {
int i,j=0;
char mojiretu[] = "あいうえおかきくけこ"; //検索される文字列です
char kensaku[] = "おか"; //検索する単語です
printf("文字列の中から、「おか」という単語を検索します\n");
for( i=0; i < strlen(mojiretu); i++) { //文字列の長さの分だけ繰り返します
while ( mojiretu[i] == kensaku[j]) {
j++; //jの値に+1します
}
}
if ( strlen(kensaku) == j ) printf("検索成功\n");
return 0;
}
0087デフォルトの名無しさん
2009/04/01(水) 12:47:440088デフォルトの名無しさん
2009/04/01(水) 12:50:35(日本語対応というか マルチバイト文字列対応は別においといて)
0089デフォルトの名無しさん
2009/04/01(水) 13:03:00whileでjだけ進んでくのはおかしかないか?
0090デフォルトの名無しさん
2009/04/01(水) 13:09:01処理としてはおかしいが
結果としてはif条件を満たす
0091デフォルトの名無しさん
2009/04/01(水) 13:20:53char kensaku[] = "afl";
でも成功になるような。
char mojiretu[] = "abcdefghijkl";
char kensaku[] = "aaa";
でも成功になるような。
0092デフォルトの名無しさん
2009/04/01(水) 13:33:54なんで2回書くの?
0093デフォルトの名無しさん
2009/04/01(水) 13:39:000094デフォルトの名無しさん
2009/04/01(水) 13:48:00じゃねーの?
0095デフォルトの名無しさん
2009/04/01(水) 13:53:23別々のことを書いてるのに2回とかw
0096デフォルトの名無しさん
2009/04/01(水) 13:58:14ヒント:釣り餌
009786
2009/04/01(水) 14:23:10やっぱりそうですよね・・・
>>88
strstrって何だって思ってググってみたんですけどこれ便利そうですね
ありがとうございます
>>89
確かにifでやった方が良かったかもです。
>>91
あ、確かにそうみたいです。直さないと・・・・
0098デフォルトの名無しさん
2009/04/04(土) 17:16:280・90・180・270を渡しても
-1と1が返ってこないです。
バグですか?
0099デフォルトの名無しさん
2009/04/04(土) 17:20:04実数演算は近似計算だから、どうしても誤差からは逃れられない。
0100デフォルトの名無しさん
2009/04/04(土) 17:22:130101デフォルトの名無しさん
2009/04/04(土) 17:35:190102デフォルトの名無しさん
2009/04/04(土) 17:55:160103デフォルトの名無しさん
2009/04/04(土) 17:58:270104デフォルトの名無しさん
2009/04/04(土) 18:13:500.0 を渡したらどうなる?
0105デフォルトの名無しさん
2009/04/04(土) 19:05:20初心者のうちはコンパイラのバグという高尚な敵と戦えるような高度なコードは書けないから
自分が間違っていると決めつけた方がいいよ。
g++で
const double PI =3.1415926535;
std::cout << std::sin(0.0) << std::endl;
std::cout << std::sin(90.0) << std::endl;
std::cout << std::sin(180.0) << std::endl;
std::cout << std::sin(270.0) << std::endl;
std::cout << std::sin(0.0 /180*PI) << std::endl;
std::cout << std::sin(90.0 /180*PI) << std::endl;
std::cout << std::sin(180.0/180*PI) << std::endl;
std::cout << std::sin(270.0/180*PI) << std::endl;
としてみたら
0
0.893997
-0.801153
-0.176046
0
1
8.97932e-011(つまり0)
-1
となった。
C言語でも同じだろうな。
要するに技術屋なら 度数法°でなく弧度法radでやれ、ということだ。
0106デフォルトの名無しさん
2009/04/04(土) 19:08:48WWWWW
0107デフォルトの名無しさん
2009/04/04(土) 19:10:03アタマ沸いた?
0108デフォルトの名無しさん
2009/04/04(土) 19:33:180109デフォルトの名無しさん
2009/04/04(土) 19:35:55windowsの電卓は一般ユーザー向けだからだろ。
いやしくも理数系人間を対象にしていたらradだろ。
0110デフォルトの名無しさん
2009/04/04(土) 19:40:40「Cライブラリの三角関数系は弧度法を使ってるものが多い」
まではおk。
だが「技術屋なら弧度法を使え」というのはNG
技術屋じゃないことがすぐわかる表現だなw
0111デフォルトの名無しさん
2009/04/04(土) 20:27:18Windowsの電卓にも関数電卓モードがあるだろ
0112デフォルトの名無しさん
2009/04/04(土) 21:13:320113デフォルトの名無しさん
2009/04/04(土) 21:14:13単位radってとこまでC標準の仕様じゃないの?
0114デフォルトの名無しさん
2009/04/04(土) 21:15:330115デフォルトの名無しさん
2009/04/04(土) 21:25:43ルール違反をした場合はC処理系の仲間はずれにするかも
といった程度の協定事項に過ぎないと思われ
0116デフォルトの名無しさん
2009/04/04(土) 22:34:36もうどうでもいいな。議論は出尽くした。終了。
0117デフォルトの名無しさん
2009/04/04(土) 22:40:21main()
{
char *p;
char a = 'A';
char b = 'B';
char c = 'C';
p = &b;
printf("%x : %c\n", p, *p);
p++;
printf("%x : %c\n", p, *p);
}
上は「基礎からのC言語」(内田保雄)という本のプログラムですが
私のPCでコンパイルすると
'c'に代入した値は使われていない(関数main)
'a'に代入した値は使われていない(関数main)
という警告文が出てしまうんですが。
0118デフォルトの名無しさん
2009/04/04(土) 22:50:00というか、その本については全然知らないけど「基礎」でそんなことやってしまっていいんだろうか。
0119デフォルトの名無しさん
2009/04/04(土) 22:55:25そのように解釈してくれるユーザーばかりではないから
警告過多なコンパイラが多くなってしまった。
警告が出ないようにコードを修正することはバグを
防ぐという意味では良い結果につながることが多いが
セキュリティーの観点からいろいろと細かいコーディング
ルールを設定している開発現場は多い。
そういった場合に警告が邪魔で仕方が無いので
警告を抑止した結果重大なバグが発生してしまった事例
が少なからずある。
0120デフォルトの名無しさん
2009/04/04(土) 23:03:18警告をどう判断するかは人間しだい
「それは判ってる。コードはそのままで構わない」
「おっとこれはまずい。コードを修正しよう」
お好きなように
0121デフォルトの名無しさん
2009/04/04(土) 23:08:05>>118の言う通り、字面通りの意味だな。
コンパイラが警告文を出してくれるのは親切の意味であり、別に必ずしも従う必要はない。
分かっててやってるならね。
…と思ったら既に>>120が似たような返事してくれてたか。
0122デフォルトの名無しさん
2009/04/04(土) 23:09:420123デフォルトの名無しさん
2009/04/04(土) 23:10:042chビューアみたいな、
警告あぼーん機能
があったら便利そうでないか?
0124デフォルトの名無しさん
2009/04/04(土) 23:22:290125デフォルトの名無しさん
2009/04/04(土) 23:48:060126デフォルトの名無しさん
2009/04/04(土) 23:49:32あれ?あるっけ?
個別のプロジェクト毎に好きな種類の警告を簡単に一つずつあぼんしていくのを想定している。
よー分からんが、IDE次第ではあるのかな。
0127デフォルトの名無しさん
2009/04/04(土) 23:50:33個人的にはIDEの設定として欲しいなぁ。
マクロはいやぁん。
0128デフォルトの名無しさん
2009/04/04(土) 23:56:36☆コンパイラの出す警告はそれなりに的をついており
その原因をfixすることはコードの確実性には寄与することが多い。
☆しかし実際の開発現場ではローカルコーディング規約などの
制限から、コンパイラに完全に警告を出さないコードを書くことが
出来ない場合がある。
☆警告は煩いのでオプションで抑止するケースが多いが
このことが本来警告を真面目に受けて対応していれば
回避出来たバグの発生の原因になっているかも
ってこと?
0129デフォルトの名無しさん
2009/04/04(土) 23:57:310130デフォルトの名無しさん
2009/04/04(土) 23:59:01別にそんなこと言ってないが、そう読めた?
0131デフォルトの名無しさん
2009/04/05(日) 00:00:17技術、特に土木建設関係では度数法が厳然と主流
0132デフォルトの名無しさん
2009/04/05(日) 00:10:58オプションに/wd4996って入れればいいよ
0133デフォルトの名無しさん
2009/04/05(日) 00:11:000134デフォルトの名無しさん
2009/04/05(日) 02:35:360135デフォルトの名無しさん
2009/04/05(日) 02:49:21出来るんだ
0136デフォルトの名無しさん
2009/04/05(日) 04:20:18【 1 】 /* 文字列の標準ヘッダーファイルの取り込み */
#define TRUE 1
#define FALSE 0
int passCheck(char *p); /* ユーザー作成関数のプロトタイプ宣言 */
void main()
{
char buff[256];
int cnt, flg = FALSE;
for (cnt=1; 【 2 】 ; cnt++)
{
printf("パスワードは?=> ");
scanf("%s",buff);
flg = 【 3 】 ;
if (flg == TRUE)
printf("パスワードは合致しました。\n");
else
printf("%d回目 入力ワード %s は間違っています。\n",cnt,buff);
}
}
0137デフォルトの名無しさん
2009/04/05(日) 04:21:42{
static char *pass = "MissionC";
int flg;
flg = strcmp(pass,p);
if (【 4 】 )
return TRUE;
else
return FALSE;
}
0138デフォルトの名無しさん
2009/04/05(日) 04:22:570139デフォルトの名無しさん
2009/04/05(日) 04:44:27http://pc12.2ch.net/test/read.cgi/tech/1235927586/
0140デフォルトの名無しさん
2009/04/05(日) 05:13:420141デフォルトの名無しさん
2009/04/05(日) 05:20:510142デフォルトの名無しさん
2009/04/05(日) 05:26:33どっちが出世が遅れる?教わるほう?それとも教えるほう?
0143デフォルトの名無しさん
2009/04/05(日) 05:28:330144デフォルトの名無しさん
2009/04/05(日) 05:30:100145デフォルトの名無しさん
2009/04/05(日) 06:00:450146デフォルトの名無しさん
2009/04/05(日) 06:12:100147デフォルトの名無しさん
2009/04/05(日) 08:50:00取り込んでれば無難ですかね?
gcc環境下で組んでるんですが、ネットで調べたstdio.hを取り込んでも
使えません・・・
0148デフォルトの名無しさん
2009/04/05(日) 09:16:530149デフォルトの名無しさん
2009/04/05(日) 09:20:560 除算エラーになりました
0150デフォルトの名無しさん
2009/04/05(日) 09:22:41そうそう
調べてると環境によって0&1でよくないケースもあるようで
なるべくは自前で入れたくないんですよね・・・
0151デフォルトの名無しさん
2009/04/05(日) 12:24:100152デフォルトの名無しさん
2009/04/05(日) 12:43:43友達に言われたんだが…
0153136
2009/04/05(日) 12:52:42質問してんだろうが。
0154デフォルトの名無しさん
2009/04/05(日) 12:54:08だからそういうのは宿題スレでお願いしなさい
0155デフォルトの名無しさん
2009/04/05(日) 12:54:18暴言吐くなら鼬害。
0156デフォルトの名無しさん
2009/04/05(日) 12:55:23そうですね。
0158デフォルトの名無しさん
2009/04/05(日) 13:14:35【1】以外全部0でおk
【1】は空
べ,べつにあんたの単位なんてどうでもいいんだからね・・・///
0159デフォルトの名無しさん
2009/04/05(日) 16:49:24見苦しくしてまで一文字省略する意味がわからない
0160デフォルトの名無しさん
2009/04/05(日) 17:04:240161デフォルトの名無しさん
2009/04/05(日) 17:30:030162デフォルトの名無しさん
2009/04/05(日) 17:54:590163デフォルトの名無しさん
2009/04/05(日) 20:02:180164デフォルトの名無しさん
2009/04/06(月) 17:57:441000×1000の行列ベクトル積の計算プログラムが課題として出たのですが、デバッグするとよくわからないエラーが出て困っています。
'行列ベクトル積.exe': 'C:\Documents and Settings\管理者\My Documents\Visual Studio 2005\Projects\行列ベクトル積\debug\行列ベクトル積.exe' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\msvcrt.dll' を読み込みました。シンボルが読み込まれていません。
行列ベクトル積.exe の 0x00411ab7 で初回の例外が発生しました: 0xC00000FD: Stack overflow
行列ベクトル積.exe の 0x00411ab7 でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow
プログラム '[10012] 行列ベクトル積.exe: ネイティブ' はコード 0 (0x0) で終了しました。
;が無いとかで怒られたことはありますけどこういう形のエラーは初めてです。
プログラムを組むのが1年ぶりくらいなので、もしかしたら基本的な見落としをしているのかもしれませんがさっぱり原因がわかりません。
どうかよろしくお願いします。
0165デフォルトの名無しさん
2009/04/06(月) 18:00:18原因は書いてあるそのまま。
Stack overflow
0166150
2009/04/06(月) 18:04:53問題はこれ
int a[1000][1000];
int x[1000];
int b[1000] = {0};
前にもスタックにdoubleの配列を大量に確保しようとしてたやついたな
メモリの確保については教えてくれないのか?>ちぇんちぇえ
0167デフォルトの名無しさん
2009/04/06(月) 18:07:03なんか名前書き込んでもた
0168デフォルトの名無しさん
2009/04/06(月) 18:34:19exeってなってるからVisualC++あたりと想定して、
デフォルトのスタックサイズは1MBだから、スタックオーバーフローですな。
スタックに置かないか、スタックサイズを大きくするかだな。
自動変数はスタックに置かれる。
0169デフォルトの名無しさん
2009/04/06(月) 18:35:42stack を使わないように static にしたり
動的確保でヒープ領域を使ったり
0170デフォルトの名無しさん
2009/04/06(月) 18:36:01static int x[1000];
static int b[1000] = {0};
とりあえずはこれでOK?
0171デフォルトの名無しさん
2009/04/06(月) 18:36:51static int b[1000];
これでいいか
0172デフォルトの名無しさん
2009/04/06(月) 19:07:59auto は関数内でしか使わない変数向き
関数内 static は関数内で静的に確保したいとき
グローバル static はプログラムが動いてる間確保したいとき
本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば
緊急避難的に関数内 static を使うのがいいんジャマイカ
0173デフォルトの名無しさん
2009/04/06(月) 19:16:01で、マルチスレッド対応時に あー ってなると
0174164
2009/04/06(月) 19:45:33>>170さんの通りにしたらきちんと動くようになりました。
ところで結果表示の時に701〜999、までしか表示されないのは単に表示行数の問題でしょうか。
0175デフォルトの名無しさん
2009/04/06(月) 19:57:07コンソールアプリだとウインドウが管理できる行数がデフォルトで
決まってるので最後の方の結果だけが残ってる可能性が
コンソールウインドウの設定を変えてログ行数増やすとかしないとだめかな?
0176デフォルトの名無しさん
2009/04/06(月) 20:11:14無駄??
0177デフォルトの名無しさん
2009/04/06(月) 20:38:12わかりました。ありがとうございます。
結果の表示はしなくてもいいのでとりあえず無くすことにします。
0178デフォルトの名無しさん
2009/04/06(月) 20:47:420179デフォルトの名無しさん
2009/04/06(月) 22:44:42身長の入力をするとループして先に進めないです
どこが間違っているのか指摘をお願いします
0180デフォルトの名無しさん
2009/04/06(月) 22:46:431(one)でなくてl(ell)
0181デフォルトの名無しさん
2009/04/06(月) 22:50:02!!
ありがとうございます。目が疲れていたようですw
0182デフォルトの名無しさん
2009/04/06(月) 22:59:33これ常識
0183デフォルトの名無しさん
2009/04/07(火) 00:44:25%le とかもあるがな
0184デフォルトの名無しさん
2009/04/07(火) 10:24:37デフォルトだと2KBだったよねえ
0185デフォルトの名無しさん
2009/04/07(火) 12:26:03スタックオーバーフローしたら無闇に増やすより
真っ先にスタックから静的変数領域に追い出したな
0186デフォルトの名無しさん
2009/04/07(火) 13:39:02printf(":");
if((command = getchar()) == 'a')
addlist();
else if(command == 'b')
delete();
else if(command == 'c')
showlist();
else if(command == 'q')
exit(0);
else
puts("Illegal command");
puts("");
};
上記はmain関数内の繰り返しで、結果が以下のように出力されます。
******************************************************** <---ここから
:a <---for(;;){}内のプロンプトが表示されaddlist()を実行した
>34 <---addlist()のプロンプトが表示され34を入力した
:Illegal command <---ここが原因のわからない表示
: <---addlist()実行後に復帰してfor(;;){}内のプロンプトが再び表示される
******************************************************** <---ここまで
実行環境:cygwin gcc versin 3.4.4
どうやら実行後に復帰したプロンプトが表示される前に、一回多く繰り返しを行っているようなのですが、
なぜ繰り返しが起こるのか、原因の見当がつきません。
このようなことが起こる原因がわかる方がいたらどうぞ教えてください。
0187デフォルトの名無しさん
2009/04/07(火) 13:51:15scanfの問題点と回避方法
改行文字の取り扱い
0188デフォルトの名無しさん
2009/04/07(火) 15:05:36ありがとうございます。
解決しました:-)
0189デフォルトの名無しさん
2009/04/09(木) 01:35:45プログラム全体を一気に書き換えた後に、デバッグ工程の俺にプログラムが送られてくるわけだが動作どころかコンパイルすら通らない。
このやり方では確実に見つけにくいバグが紛れ込むと思うんだがこういう手法って一般的なんだろうか。
0190デフォルトの名無しさん
2009/04/09(木) 01:37:16日本はそうやってゼネコンが作ったシステムのまねをして分業化する。
だからIT土方と言われる
0191デフォルトの名無しさん
2009/04/09(木) 02:32:32上司の名前を使って、バグだらけのコードをわざと書いて
デバッグ工程に回すのが吉
それで上司が文句を言ってきたら、「責任を人になすり付ける会社」
としてさっさとその会社に見切りをつけることが吉。
0192デフォルトの名無しさん
2009/04/09(木) 02:43:420193デフォルトの名無しさん
2009/04/09(木) 03:01:17たとえデバッグを他人に押し付けても
自分が一番作った気になれる部分じゃん
本人はそれで満足したいんだよ
0194デフォルトの名無しさん
2009/04/09(木) 03:57:28そもそもコンパイルが通っていないなら、コーディングが済んだとは言えんだろ。
0195デフォルトの名無しさん
2009/04/09(木) 09:33:480196デフォルトの名無しさん
2009/04/09(木) 09:34:260197デフォルトの名無しさん
2009/04/09(木) 13:19:520198デフォルトの名無しさん
2009/04/09(木) 22:46:43それで仕事になっているということは、
君がすごいんじゃないか?
普通に考えて、デバッグのがしんどいだろ。
他人のデバッグなんてホントに難しいってか…(ry
0199デフォルトの名無しさん
2009/04/09(木) 23:00:010200デフォルトの名無しさん
2009/04/09(木) 23:23:490201デフォルトの名無しさん
2009/04/10(金) 02:39:44とても関心いたします
0202デフォルトの名無しさん
2009/04/10(金) 03:08:25最初からその人が書いたほうが早いんじゃねーか?
0203デフォルトの名無しさん
2009/04/10(金) 03:13:56そう思わない駄目上司がいるからIT業界は概ねブラックで
そういうシステムだからこそIT土方と言われるんだし・・・
0204198
2009/04/10(金) 07:02:09俺のレスの
>他人のデバッグなんてホントに難しいってか…(ry
この
…(ry
の部分がまさに君の
>最初からその人が書いたほうが早いんじゃねーか?
だ。同意。
0205デフォルトの名無しさん
2009/04/10(金) 09:15:370207デフォルトの名無しさん
2009/04/10(金) 20:27:13コードはプロジェクトの共有物なんだから
0208デフォルトの名無しさん
2009/04/10(金) 21:26:48#include <stdlib.h>
int main(int argc, char *argv[])
{
int sum;
int table[10]={1,2,3,4,5,6,7,8,9,10};
int i;
double ave;
i=0;
ave=0;
sum=0;
for(i=0;i<10;i++)
{
sum+=table[i];
}
ave=sum/10;
printf("%d",ave);
system("PAUSE");
return 0;
}
これをコンパイルして実行しても結果が0にしかなりません。
どこがおかしいのでしょうか?
教えてください
0209デフォルトの名無しさん
2009/04/10(金) 21:28:48書式を調べたほうが
0210デフォルトの名無しさん
2009/04/10(金) 21:29:51この辺なんか
0211デフォルトの名無しさん
2009/04/10(金) 21:32:03あと、aveをdoubleにしても、ave=sum/10.0; とかにしないと、少数が切り捨てられる。
0212デフォルトの名無しさん
2009/04/10(金) 21:38:09無事に実行できました。わからなく、モヤモヤしてたので助かりました。
ホントにありがとでした><
0213デフォルトの名無しさん
2009/04/10(金) 23:08:11そこはなかなか読んでダメになるサイトですね。前にも他のページで指摘しているけど、今回はこれを見つけた。
>\' 文字としての ' 2C
asciiの0x2cはいつからシングルクォートになったんだかw
0214デフォルトの名無しさん
2009/04/11(土) 03:33:18こんな理解力の無い奴もプログラマやってんのかな
0215デフォルトの名無しさん
2009/04/11(土) 11:34:470216デフォルトの名無しさん
2009/04/11(土) 11:36:26main(){
int a,b;
scanf("%d",&a);
scanf("%d",&b);
printf("%d + %d = %d",a,b,a+b);
return 0;
}
を実行したとき、数字以外を入力すると
1 + 256 = 257
となります。
数字以外が入力された際、エラーメッセージを表示して再入力を促すようにしたい場合
どうしたらよいでしょうか?
0217デフォルトの名無しさん
2009/04/11(土) 11:41:43main(){
int a,b;
do{
scanf("%d",&a);
scanf("%d",&b);
}while(a<'0'||'9'<a||b<'0'||'9'<b);
printf("%d + %d = %d",a,b,a+b);
return 0;
}
0218デフォルトの名無しさん
2009/04/11(土) 12:00:50printf("error\n");
continue;
}
0219デフォルトの名無しさん
2009/04/11(土) 12:05:090220デフォルトの名無しさん
2009/04/11(土) 12:08:41半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0221デフォルトの名無しさん
2009/04/11(土) 15:30:28要素数には定数しか使えないと解説書にあったのですが・・・
0222デフォルトの名無しさん
2009/04/11(土) 15:33:180223デフォルトの名無しさん
2009/04/11(土) 15:40:340224デフォルトの名無しさん
2009/04/11(土) 15:43:59スレ違い
0225デフォルトの名無しさん
2009/04/11(土) 16:01:32あれ?いまどきのCは変数で配列のサイズ確保できたんじゃね?
ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719
0226デフォルトの名無しさん
2009/04/11(土) 16:05:15C99なら
0227デフォルトの名無しさん
2009/04/11(土) 16:06:27それが使えない環境が広く普及してる
0228デフォルトの名無しさん
2009/04/11(土) 16:11:21って何?古い環境で保守、ってこと?
0229デフォルトの名無しさん
2009/04/11(土) 16:11:44ぐぐり方が足りないようでした
DOOMすいませんでした
0230デフォルトの名無しさん
2009/04/11(土) 16:21:59VCが対応していないしな。
いまだに新規開発でもC90を使っているところが多いんじゃないかな。
0231デフォルトの名無しさん
2009/04/11(土) 16:23:120232デフォルトの名無しさん
2009/04/11(土) 16:29:350233デフォルトの名無しさん
2009/04/11(土) 16:38:45それだけ使いやすい言語だという事だよ、ワトソン君。
0234デフォルトの名無しさん
2009/04/11(土) 16:51:010235デフォルトの名無しさん
2009/04/11(土) 20:22:42それやったら無限ループだな。
0236デフォルトの名無しさん
2009/04/11(土) 20:28:31それと>>217もひどすぎるw
0237デフォルトの名無しさん
2009/04/11(土) 20:36:270238デフォルトの名無しさん
2009/04/11(土) 20:38:45Cは使うな
0239デフォルトの名無しさん
2009/04/11(土) 20:44:010240デフォルトの名無しさん
2009/04/12(日) 15:14:430241デフォルトの名無しさん
2009/04/12(日) 15:23:48そりゃまあ使い方次第だが。。。
そんな言い方したらgoto文も同じだよね。
0242デフォルトの名無しさん
2009/04/12(日) 15:27:390243デフォルトの名無しさん
2009/04/12(日) 15:29:13どう違う?
0244デフォルトの名無しさん
2009/04/12(日) 15:49:160246デフォルトの名無しさん
2009/04/12(日) 15:55:29アドバイスするときに添える理由。
・他の入力関数にくらべて挙動に癖があって初心者には使いにくい。
・がんばって挙動に精通しても実践の場で使うことはほとんどない。
0247デフォルトの名無しさん
2009/04/12(日) 16:01:070248デフォルトの名無しさん
2009/04/12(日) 16:09:10キーボードとは相性が悪い
0249デフォルトの名無しさん
2009/04/12(日) 16:12:570250デフォルトの名無しさん
2009/04/12(日) 16:16:18入力と数値の変換を同時にやるから、説明が簡単だっておもっちゃうのかね。
教わる側からすると、エラーリカバリとかやろうとするととたんに難しくなるな。
0251デフォルトの名無しさん
2009/04/12(日) 16:19:58素人乙。お前みたいな固定概念しかない奴は応用力がない。
一生あれもこれも欠点を持ち出して駄目だといい続けてな。
現に、お前が使っている言語もOSさえも、完璧なものはない。
0252デフォルトの名無しさん
2009/04/12(日) 16:21:21まったく説明ができないくせに、駄目だとされるものがあれば
もうそれは駄目。自動車で悲惨な事故が起こる、航空機は墜落したら
大惨事、人間は生きているだけで老化してやがて死ぬから駄目
といっているようなもの。進歩のない奴はいつまでも発展しないまま
情報弱者のくせして知ったかぶりでこの世を去るんだろう。
0253デフォルトの名無しさん
2009/04/12(日) 16:23:34リストアップして出版社にクレームをしておけよ>知ったかぶりのscanf駄目厨
0254デフォルトの名無しさん
2009/04/12(日) 16:23:53お前ら全員うるせーな
俺はC++大好きっ子だからもうC言語なんてどうでもいい環境なんだよ。
・・・は言い過ぎだけど、scanfが便利だろうが便利じゃなかろうが関係ない環境であることは確か。
0255デフォルトの名無しさん
2009/04/12(日) 16:28:13・バッファの消費が書式文字列に依存して、ほかの入力関数とまぜて使いにくい
・数値のオーバーフローに対応できない
・文字列のバッファーオーバーフローの対応が
書式文字列に定数でバッファ長を埋め来なくてはいけなくて
ださい。(もしくは書式文字列を実行時作成するとか)
0256デフォルトの名無しさん
2009/04/12(日) 16:32:260257デフォルトの名無しさん
2009/04/12(日) 16:35:560258デフォルトの名無しさん
2009/04/12(日) 16:39:52scanf()がだめな理由を言えって言うのに、それが述べられても反論はしないんだな。
0259デフォルトの名無しさん
2009/04/12(日) 16:42:300260デフォルトの名無しさん
2009/04/12(日) 16:45:200261デフォルトの名無しさん
2009/04/12(日) 16:46:49としても添え字でa[10]とかそれ以上の番号を指定できるから
これも駄目ね。使った奴は素人w
0262デフォルトの名無しさん
2009/04/12(日) 16:50:26配列は配列を使う以外の簡単な改善案がない。
scanf()はほかの関数を使えば簡単に解決できる。
0263デフォルトの名無しさん
2009/04/12(日) 16:52:450264デフォルトの名無しさん
2009/04/12(日) 16:53:00問題点を克服するより使わないってのが一番簡単な解決策。
0265デフォルトの名無しさん
2009/04/12(日) 16:56:31きっとすっきりするぞ。
0266デフォルトの名無しさん
2009/04/12(日) 17:41:25初心者は、文字列扱うときにstr系関数を組み合わせて苦労して
複雑なプログラム作るけど、慣れた人なら sscanf ひとつで
済ませられたりする
scanfは使わないけどscanfの書式(とくにスキャン集合)は
知っておくべき
0267デフォルトの名無しさん
2009/04/12(日) 18:31:400268デフォルトの名無しさん
2009/04/12(日) 18:52:070269デフォルトの名無しさん
2009/04/12(日) 18:53:580270デフォルトの名無しさん
2009/04/12(日) 18:59:350271デフォルトの名無しさん
2009/04/12(日) 19:33:02fgetsとsscanfをセットで使え
0272デフォルトの名無しさん
2009/04/12(日) 20:30:062
3 int main(void){
4 struct tag{
5 char str[6];
6 }aa;
7 aa = *(struct tag *)"HELLO";
8 printf("%s\n",aa.str);
9 return 0;
10 }
/*実行結果*/
HELLO
aa = *(struct tag *)"HELLO";の部分が説明を読んでも
何をやっているのかわかりません。
だれか教えてください。
0273デフォルトの名無しさん
2009/04/12(日) 20:33:51そんなしょうもないコード、誰がどこでどんな説明を書いているの?
0274デフォルトの名無しさん
2009/04/12(日) 20:34:51"HELLO" のある領域を構造体だと思って読み出す感じ
0275デフォルトの名無しさん
2009/04/12(日) 20:34:540276デフォルトの名無しさん
2009/04/12(日) 20:44:46memcpy(&aa, "HELLO", 6);
と同等
0277デフォルトの名無しさん
2009/04/12(日) 20:47:30教材のソースです。
文字列は配列なので代入できないが、構造体をつかうとできるということを
説明してあるようなんですが、よくわからないのです。
0278デフォルトの名無しさん
2009/04/12(日) 20:49:490279デフォルトの名無しさん
2009/04/12(日) 20:53:52まあ理解しつつも、心の中ではこんなカス教材よこしやがってと思ったほうがいいねw
いつの時代のPGやねんと
0281デフォルトの名無しさん
2009/04/12(日) 20:56:14普通つかわねーだろと
0282デフォルトの名無しさん
2009/04/12(日) 21:01:31aa = *(struct tag *)"HELLO";
「(struct tag *)"HELLO"」はchar*をstruct tag*にポインタ型を変換してる
「*(struct tag *)"HELLO"」はstruct tag構造体として扱われる
「aa = *(struct tag *)"HELLO"」でaaに*(struct tag *)"HELLO"を構造体コピーする
0283デフォルトの名無しさん
2009/04/12(日) 21:15:51丁寧な回答ありがとうございます。
考えてみます。
ところでみなさんとても詳しいですね。専門の方ですか?
あと、こんなにすぐに返答を頂けてとてもびっくりしています。
一週間後にまたここのサイト見れば答えて頂けるかもしれないと思っていました。
0284デフォルトの名無しさん
2009/04/12(日) 21:22:33typedef char tag_aa[6];
tag_aa aa = *(tagaa*)"HALLO";
は不可?
0285デフォルトの名無しさん
2009/04/12(日) 21:23:28ちょっとやってみます。
0286デフォルトの名無しさん
2009/04/12(日) 21:23:52不可
0287デフォルトの名無しさん
2009/04/12(日) 22:00:25すみません。やるといっておきながら
>>284さんの言っていることがよくわかりません。
本当に申し訳ありません。
答えてくださった方達にはとても感謝しています。
ありがとうございました。
0288デフォルトの名無しさん
2009/04/12(日) 22:13:23あまり2chに慣れていないようだから言っておきましょう。
別にこのスレの事を言いたい訳じゃないけど・・・
あくまで2chは2chです。
嘘ついてくる意地の悪いやつも多い情報危険地帯です。
信じるか信じないかはあなた次第です。
0289デフォルトの名無しさん
2009/04/13(月) 02:02:27そんなこと書いたら、お前自身もなかなか意地悪なレスに思えてくるぞw
0290デフォルトの名無しさん
2009/04/13(月) 08:52:19確かにこの世の全員が閲覧、書き込みをしているわけでもなく
最近では企業や関係者が一般人に紛れ込んでいることもあるが
この世が自分中心に回っていると勘違いしているのか、主観で
他社を否定する基地外が増えている。お前こそこの世の一人に過ぎないと
気づくべき。たとえ大企業の社員でも。GKとか朝日とか思い上がりすぎ。
基地外社員は不祥事がバレて懲戒免職w
0291デフォルトの名無しさん
2009/04/13(月) 10:39:56しまった。時間つぶしにscanf(不毛)論争に油を注ぐとするか...
個人的にはscanf,printf系は消極的に使いたい派
純正UNIX育ちならば積極派だったんだろうな
DOSでCを覚えた世代は消極系だと思う。消極的である理由は
ライブラリの規格に過ぎないこと。つまりライブラリが統一
出来ない環境ではトラブルの種。出力利用の場合は文字列と
して得られるのでまだ調整可能であるかもしれんが、
入力系利用の場合は問題がすぐに発覚しない場合もあり得て
その時は怖いから。だから文字列として受け取って頭から
一文字ずつ読んで解釈していくコードを書きたいと本能的
に思う
0292デフォルトの名無しさん
2009/04/13(月) 12:25:320293デフォルトの名無しさん
2009/04/13(月) 12:41:21DOSどうこうとか、規格が統一されてないからとかって考察は外れてるだろうな。
0294デフォルトの名無しさん
2009/04/13(月) 12:43:530295デフォルトの名無しさん
2009/04/13(月) 12:51:45char s[256];
sprintf(s,"%lf",d);
sscanf(s,"%lf",&dd);
としてd==ddが保証されると思ってる?
0296デフォルトの名無しさん
2009/04/13(月) 12:54:140297デフォルトの名無しさん
2009/04/13(月) 12:56:58そっとしておこう
0298デフォルトの名無しさん
2009/04/13(月) 14:02:29そんなことより
sprintf(s,"%lf",d);
は
sprintf(s,"%f",d);
でいいよ
0299デフォルトの名無しさん
2009/04/13(月) 17:23:290300デフォルトの名無しさん
2009/04/13(月) 17:31:04間違える人が多いのでどちらでもよくなったんだよ
0301デフォルトの名無しさん
2009/04/13(月) 18:24:470302デフォルトの名無しさん
2009/04/13(月) 19:49:340303デフォルトの名無しさん
2009/04/13(月) 20:10:27DOSの頃はlfでdouble指定だったようだ
じゃあなぜfloatとdoubleの指定を分けなくていいのかというと
floatはスタックに積む際doubleに変換されるからである
0304デフォルトの名無しさん
2009/04/13(月) 20:17:470305デフォルトの名無しさん
2009/04/13(月) 20:18:450306デフォルトの名無しさん
2009/04/13(月) 21:11:06ヘルプにはlはdouble型を指定とか書いてるが嘘だった
float f = 1.0;
double d = 1.0;
printf("%f %lf\n", f, d);
printf("%f %lf\n", d, f);
出力結果は同じだった
そりゃ明示的にfloatを宣言しない限りdoubleに変換されるもんな
0307デフォルトの名無しさん
2009/04/13(月) 21:58:410308デフォルトの名無しさん
2009/04/13(月) 22:05:10printfの第2引数以降、floatはdoubleとして積まれる(大昔から)
つまりprintfで%lfを指定するのは間違い
エラーにはならないがコンパイラによっては指摘するものもあるみたい
0309288
2009/04/13(月) 22:59:48もちろんメタ的な意味を込めて言ってみてます。
>>290
ごめんよ、
君にはメタ視点は難しすぎたか。
今度から君のような低脳にも分かるように
書くようにつとめるのでご勘弁を。
0310デフォルトの名無しさん
2009/04/13(月) 23:17:27メタへのレスも「メタ的な意味」だから。
0311デフォルトの名無しさん
2009/04/14(火) 00:17:110312デフォルトの名無しさん
2009/04/14(火) 00:58:130313デフォルトの名無しさん
2009/04/14(火) 01:00:30非対称なのが気持ち悪いのも事実
0314デフォルトの名無しさん
2009/04/14(火) 01:15:31scanf("%f", &dbl)とかうっかりやってしまうことも稀によくある
0315デフォルトの名無しさん
2009/04/14(火) 03:21:52だから、printf()には"%g"を使う方がいいんだよ。
0316デフォルトの名無しさん
2009/04/14(火) 09:24:440317デフォルトの名無しさん
2009/04/14(火) 09:43:200318デフォルトの名無しさん
2009/04/14(火) 10:21:410319デフォルトの名無しさん
2009/04/14(火) 10:57:390320デフォルトの名無しさん
2009/04/14(火) 11:08:050321デフォルトの名無しさん
2009/04/14(火) 11:16:06抑圧。抑制。禁止。
0322デフォルトの名無しさん
2009/04/14(火) 11:31:12gはe, fの次だろ
0323デフォルトの名無しさん
2009/04/14(火) 11:59:420324taguti
2009/04/14(火) 16:10:58(x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。
・公式:底辺x高さ÷2を使って計算してください。
お願いします!!
0325tuguti
2009/04/14(火) 16:30:260326デフォルトの名無しさん
2009/04/14(火) 22:34:34間違えましたじゃねーよ
そう言うのは意図的なマルチポストって言うんだろ。
帰れ。うざいから。
0327デフォルトの名無しさん
2009/04/14(火) 22:38:36とおもったら
http://pc12.2ch.net/test/read.cgi/tech/1237091698/493
http://pc12.2ch.net/test/read.cgi/tech/1232055225/770
http://pc12.2ch.net/test/read.cgi/tech/1217575832/499
http://pc12.2ch.net/test/read.cgi/tech/1235927586/774
http://pc12.2ch.net/test/read.cgi/tech/1212498448/876
http://pc12.2ch.net/test/read.cgi/tech/1212409946/66
http://pc12.2ch.net/test/read.cgi/tech/1217575832/499
http://pc12.2ch.net/test/read.cgi/tech/1192201659/808
http://pc12.2ch.net/test/read.cgi/tech/1205156417/821
http://pc12.2ch.net/test/read.cgi/tech/1238032584/16
http://pc12.2ch.net/test/read.cgi/tech/1224719784/934
これはひどいwww
ここまで来ると逆に尊敬するマルチ野郎だな。
良識を疑う。
0328デフォルトの名無しさん
2009/04/14(火) 23:32:52てなことを、10スレ以上で言って回ってるのかおまえらは? おヒマですね
マルチポストがどーたらを言ってる奴自身、ろくな回答してねえのが多いんだよな
# 加えてクロスポストを知らなかったりするし
0329デフォルトの名無しさん
2009/04/14(火) 23:34:37クロスポストがなんの関係があるのかとかいろいろ疑問のわく書き込みだな。
0330デフォルトの名無しさん
2009/04/14(火) 23:57:24いんやこれはマルチポスト
しかもIDも無い板で”奴自信”とかイッちゃうアンタはe視野狭窄の発症者
だれも相手に出来ない
0331デフォルトの名無しさん
2009/04/15(水) 00:58:12#include <stdio.h>
int main(void)
{
> int n = 0, *p;
> p = &n;
> fprintf(stdout, "n, p = %d, %p\n", n, p);
> (*p)++;
> fprintf(stdout, "n, p = %d, %p\n", n, p);
> ++*p;
> fprintf(stdout, "n, p = %d, %p\n", n, p);
> *p++;
> fprintf(stdout, "n, p = %d, %p\n", n, p);
> return 0;
}
0332デフォルトの名無しさん
2009/04/15(水) 01:07:55未定義動作が含まれているぞ
0333デフォルトの名無しさん
2009/04/15(水) 01:19:460334331
2009/04/15(水) 02:02:58再挑戦
実行結果を正しく予測できますか?
*/
#include <stdio.h>
int main(void)
{
int n = 0, *p;
p = &n;
fprintf(stdout, "n, p = %d, %p\n", n, p);
(*p)++;
fprintf(stdout, "n, p = %d, %p\n", n, p);
++*p;
fprintf(stdout, "n, p = %d, %p\n", n, p);
*p++;
fprintf(stdout, "n, p = %d, %p\n", n, p);
return 0;
}
0335デフォルトの名無しさん
2009/04/15(水) 03:31:19実行結果は鼻から悪魔が出るなりなんなりOK
0336デフォルトの名無しさん
2009/04/15(水) 03:35:20見てるかもしれないけど一応リンク張っておく
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
0337デフォルトの名無しさん
2009/04/15(水) 06:44:11気のせいじゃないの
0338デフォルトの名無しさん
2009/04/15(水) 06:54:480339デフォルトの名無しさん
2009/04/15(水) 09:26:02あんがと
0340デフォルトの名無しさん
2009/04/15(水) 12:52:510341デフォルトの名無しさん
2009/04/15(水) 13:01:57小さいプログラムならいいかもしれないけどシステム固有のAPIとか
使うようになった際ポインタわからなければアドレス渡しとかでてきたら
どうするの?
0342デフォルトの名無しさん
2009/04/15(水) 13:30:020343デフォルトの名無しさん
2009/04/15(水) 13:32:09ポインタを使うときは、使うなりの理由がある。
別にグローバル変数をいっぱい作っても仕様によっては
ポインタを使う可能性が出てくるかもしれない。
0344デフォルトの名無しさん
2009/04/15(水) 20:29:470345デフォルトの名無しさん
2009/04/15(水) 21:05:22となります。ぐぐりましたが、大概は無視してOKとかいてあるんですが
根本的な原因がわかりません。どうしたらこの警告がでなくなりますか?
0346デフォルトの名無しさん
2009/04/16(木) 01:54:20もしくはlibだけじゃなくてpdbファイルも一緒にコピーすればおk
「pdb 設定」あたりでググってみれば参考になるかも
0347デフォルトの名無しさん
2009/04/16(木) 22:25:38分からん
0348デフォルトの名無しさん
2009/04/16(木) 22:27:500349デフォルトの名無しさん
2009/04/16(木) 23:18:00int main()
{
int tbl[100];
int i;
FILE* fp = fopen("a.txt", "r");
i = 0;
while (fscanf("%d", &tbl[i++]) != EOF)
;
return 0;
}
0350デフォルトの名無しさん
2009/04/17(金) 07:41:18ありがとう 参考になりました
0351デフォルトの名無しさん
2009/04/17(金) 21:27:18ttp://xn--n9q36mh1hnxuksz7wt.jp/FE16b-pm/t06.html
の「プログラム」部分で、
if ( replaceChar( □□□ ) ) {
なんたらかんたら〜
}
って部分があるじゃないですか。
この□□□には " *input "が入るらしいんですが、
なぜこうなるのかイマイチよくわからないのです。
この "*input "の内容によっては 0 か 1 が帰ってくるみたいなんですが、
このifってのは( )の中の内容が当たっているか当たってないかだけでなくて
0か1でもいいってことなんでしょうか?
0352デフォルトの名無しさん
2009/04/17(金) 21:37:00statement1
[else
statement2]
expression が真 (0 以外) であると、if キーワードによって statement1 が実行されます。
else があり、expression が偽 (0) であると、statement2 が実行されます。
statement1 または statement2 の実行後は、制御が次のステートメントに移ります。
0353デフォルトの名無しさん
2009/04/17(金) 21:43:55ifの内容が0だと内容が偽と同じだってことですか。
ありがとうございました。
0354デフォルトの名無しさん
2009/04/17(金) 22:15:26>349の条件判断は、 != EOFではなく== 1にすべきだな。
0355デフォルトの名無しさん
2009/04/17(金) 22:18:13そこだけ突っ込むのは釣りか?
0356デフォルトの名無しさん
2009/04/17(金) 22:23:17あー、fopen()の戻り値はチェックすべきだし、fclose()位してもばちは当たらんね。
0357デフォルトの名無しさん
2009/04/17(金) 22:30:420358デフォルトの名無しさん
2009/04/17(金) 22:32:14なんで?
0359デフォルトの名無しさん
2009/04/17(金) 22:33:30ttp://xn--n9q36mh1hnxuksz7wt.jp/FE16b-pm/t06.html
で、 *inputの中身を4ビットだけ右にずらす作業があるみたいなんですけども、
なぜ、4ビットずらすと " ! "が " 2 "になるのか全くわかりません。
4ビットだけずらすと0x21が0x32になるらしいんですけども・・・・
0360デフォルトの名無しさん
2009/04/17(金) 22:35:00オープンはエラーチェック必要でリードは必要なし?
0361デフォルトの名無しさん
2009/04/17(金) 22:36:24エラーチェックしているじゃん。
0362デフォルトの名無しさん
2009/04/17(金) 22:37:374ビット抽出した後、chars配列を参照するので文字になる。
0363デフォルトの名無しさん
2009/04/17(金) 22:41:48パッと見でなんですが、
! -> 0x21 -> 0x32,0x31 ではないかな。
0364デフォルトの名無しさん
2009/04/17(金) 22:53:25あ、なるほど。
0x21の場合 0011 0001 → 0000 0011で、10の位にあったものが一の位になり、
chars[ 0011 (つまりは2)] = 2 で表されるってことですか。
どうもありがとうございました。
0365デフォルトの名無しさん
2009/04/17(金) 22:53:280366デフォルトの名無しさん
2009/04/17(金) 23:16:490011じゃなくて0010だけどね。
0367デフォルトの名無しさん
2009/04/17(金) 23:21:570368デフォルトの名無しさん
2009/04/17(金) 23:27:56カーネルのコンパイル。マジで
0369デフォルトの名無しさん
2009/04/17(金) 23:33:490370デフォルトの名無しさん
2009/04/17(金) 23:39:30初心者向けのC入門とか言ってもプログラムやりたい奴が
目にする環境だとすぐにどうでもいい感じになるので
ここでもみて開発環境とか含めて勉強しろ
http://homepage2.nifty.com/natupaji/DxLib/
http://dixq.net/rp/
0371デフォルトの名無しさん
2009/04/17(金) 23:48:28ttp://xn--n9q36mh1hnxuksz7wt.jp/FE14a-pm/t06.html
で
if ( ( Len1 >= Len2 ) && ( Len1 >= Len3 ) ) {
点を描画〜
}
ってところがあるんですけれども、
問題によると3点が隣接していれば点を打つっていうことになっているらしいんです。
三辺の長さを比べて、Len1が一番長かっただけでどうして隣接しているとわかるんでしょうか?
0372371
2009/04/17(金) 23:51:150373デフォルトの名無しさん
2009/04/18(土) 00:44:01thxxxx
0374デフォルトの名無しさん
2009/04/18(土) 00:44:33operation on 'hoge' may be undefined
というワーニングがでて
hoge=(++hoge)%3;
問題の箇所はという処理になってます。
元はVC++でコンパイルしてたものをgcc上でコンパイルしています
どう対処すればいいでしょうか?
0375デフォルトの名無しさん
2009/04/18(土) 00:45:45hoge = (hoge + 1) % 3;でいいと思う。
0376デフォルトの名無しさん
2009/04/18(土) 00:46:05hoge=(hoge+1)%3;
にするとか。
0377デフォルトの名無しさん
2009/04/18(土) 00:47:00hoge=(hoge + 1) %3;
おまえのやってることは未定義動作だからおこられてる
0379デフォルトの名無しさん
2009/04/18(土) 01:17:370380デフォルトの名無しさん
2009/04/18(土) 06:03:540381374
2009/04/18(土) 06:48:48なんかこれも読み方でひと悶着ありそうだな
0382デフォルトの名無しさん
2009/04/18(土) 07:20:47ここ埋めてやれよ
0383デフォルトの名無しさん
2009/04/18(土) 20:49:44プログラムを書く人って、変に細かいことにこだわる人が多いからね。
0384デフォルトの名無しさん
2009/04/18(土) 20:55:450385デフォルトの名無しさん
2009/04/18(土) 20:58:14いやよくないだろ
0386デフォルトの名無しさん
2009/04/18(土) 21:08:450387デフォルトの名無しさん
2009/04/18(土) 21:15:28警告かあ。ウォーニングってくるのかとオモタ。
0388デフォルトの名無しさん
2009/04/18(土) 21:24:32スターワーズ
0389デフォルトの名無しさん
2009/04/18(土) 22:03:09マイクロソフトウォード
0390デフォルトの名無しさん
2009/04/18(土) 22:05:220391デフォルトの名無しさん
2009/04/18(土) 22:08:570392デフォルトの名無しさん
2009/04/18(土) 22:36:370393デフォルトの名無しさん
2009/04/18(土) 22:43:580394デフォルトの名無しさん
2009/04/18(土) 22:48:030395デフォルトの名無しさん
2009/04/18(土) 22:51:350396デフォルトの名無しさん
2009/04/20(月) 18:39:40授業でteratermを使って、emacsでプログラミングをしているのですが
とりあえず、先生の用意したプログラムをコピペして起動してみろとのことで
普通にコピペして、コンパイルしようとしたのですが
警告: null 文字は無視されました
という文章が何十行にも渡ってでて、コンパイルできません。
調べてもなかなか対処がわからず、過去ログでの質問は自己解決していたりでわかりません。
断片的な情報から、文字コードの問題かと設定をUFT-8からEUCなどに変えてみましたが
UFT-8以外では文字化けしてしまいます。
とりあえず、インデントをしっかりTabに書き換えたりもしましたが、解決しませんでした。
どなたか、解決法を教えてください。
0397デフォルトの名無しさん
2009/04/20(月) 18:47:450398デフォルトの名無しさん
2009/04/20(月) 19:02:50ありがとうございました。
やっぱりCじゃ無かったですか・・・。
0399デフォルトの名無しさん
2009/04/20(月) 19:06:110400デフォルトの名無しさん
2009/04/20(月) 22:44:180401デフォルトの名無しさん
2009/04/20(月) 23:03:470402デフォルトの名無しさん
2009/04/20(月) 23:26:41バイナリ見るとヘッダー情報も同じように見えるのですが…
0403デフォルトの名無しさん
2009/04/21(火) 09:16:33例えば、tar cf foo.tar *.oするのと本質的に変わらない。
tar tvf foo.tarするのと同様にar tvf foo.aできる。
0404デフォルトの名無しさん
2009/04/21(火) 11:51:27.aがLinux用で.libがWindows用
知らんけど
0405デフォルトの名無しさん
2009/04/22(水) 22:07:530406デフォルトの名無しさん
2009/04/22(水) 22:11:21Winアプリって意味なら最近は殆ど無い。
流石にこんな古臭いのでWinアプリは書いてられない。
0407デフォルトの名無しさん
2009/04/22(水) 22:15:14でも.netもじわじわと進出してるからc#とかで書かれてるのも結構あるし
まあVBのおかげもあるんだろうけど
0408デフォルトの名無しさん
2009/04/22(水) 22:15:57組み込み系ならあるでしょ。
0409デフォルトの名無しさん
2009/04/22(水) 22:22:29と定義したaの値の中から、bとcの値をキーボードから入力して、
例えば、bが3でcも3なら7といったような結果を出すには
どうすればいいのか教えてください。
0410デフォルトの名無しさん
2009/04/22(水) 22:28:18ごめん日本語が意味不明なのは俺だけじゃないはず。
>aの値の中から、bとcの値をキーボードから入力して、
???
0411デフォルトの名無しさん
2009/04/22(水) 22:29:58こういう事かな?
printf("%d\n", a[b-1][c-1]);
0412デフォルトの名無しさん
2009/04/22(水) 22:29:590413デフォルトの名無しさん
2009/04/22(水) 22:32:28printf("%d",a[foo][bar]);
0414デフォルトの名無しさん
2009/04/22(水) 22:33:39えっと、3×3の表があって、縦の一列目、横の二列目という風に
それぞれ1から3までの数字をキーボードから入力するということです。
3×3の表をa、縦をb、横をcとしてしまいました…。
0415デフォルトの名無しさん
2009/04/22(水) 22:33:420416410
2009/04/22(水) 22:35:48すげーな
これだけesperがいればもう大丈夫だな。後はまかせた。
0417デフォルトの名無しさん
2009/04/22(水) 22:37:23int b,c;
これって初期化したことになりませんか?
0418デフォルトの名無しさん
2009/04/22(水) 22:38:170419デフォルトの名無しさん
2009/04/22(水) 22:38:220420デフォルトの名無しさん
2009/04/22(水) 22:38:50あくまで確保しただけ
int b = 0;
int c = 0;
とか書いたら初期化
0421デフォルトの名無しさん
2009/04/22(水) 22:50:06きちんと縦の一列目、横の二列目にある数字が最後にでてきません…。
0422デフォルトの名無しさん
2009/04/22(水) 22:51:110423デフォルトの名無しさん
2009/04/22(水) 22:51:38国語は得意だったんですが。
0424デフォルトの名無しさん
2009/04/22(水) 23:01:10%dのところに変な数字がでてきてしまいます。
scanfのところが間違っているのでしょうか。
int a[3][3]={{7,5,8},{6,5,7},{9,6,6}};
int b=0,c=0;
printf("好きな番号を入力してください。\n",b);
scanf("%d",&b);
printf("好きな番号を入力してください。\n",c);
scanf("%d",&c);
printf("\n表の文字は、%dです。\n",a[b-1][c-1]);
0425デフォルトの名無しさん
2009/04/22(水) 23:03:550426デフォルトの名無しさん
2009/04/22(水) 23:09:19これ、つけなくてもよかったんですね。
0427デフォルトの名無しさん
2009/04/22(水) 23:10:18なら初期化
0428デフォルトの名無しさん
2009/04/22(水) 23:17:22初期化はstaticを使わせてもらいます!
適当にちょこちょこ直してたらなぜかきちんとできました!
いまいちどこがだめだったのかはわかりませんが…。
答えてくださった方々、ありがとうございました!
0429デフォルトの名無しさん
2009/04/22(水) 23:17:520430デフォルトの名無しさん
2009/04/22(水) 23:48:47まてまてまて!
staticってなんだか分からないのに使うとたぶんとても困ったことになる。
頼むから適当な書籍で勉強してくれ。
0431デフォルトの名無しさん
2009/04/23(木) 00:08:30使うケースなんてレアだ
0432430
2009/04/23(木) 00:12:37> staticなんて使わない方がいい
> 使うケースなんてレアだ
俺は使いまくるけど・・・。
(C++だからか?staticメンバ関数とかとても便利。)
0433デフォルトの名無しさん
2009/04/23(木) 00:35:14void func(void)
{
static int flag;
if(flag==0){
flag = 1;
init_fuck();
}
(処理)
}
0434デフォルトの名無しさん
2009/04/23(木) 02:41:05typedef void(*func)(void) = func_1st;
void func_1st(void){
init_funk(); func=func_ord; func();
}
void func_ord(void){
//処理
}
だな
0435デフォルトの名無しさん
2009/04/23(木) 02:57:470436デフォルトの名無しさん
2009/04/23(木) 03:04:26変数funcの初期値がfunc_1st()なので、初回のfunc()はfunc_1st()を呼ぶ。
そのfunc_1st()の中でfuncを書き換えておくから、二回目以降のfunc()はfunc_ord()を呼ぶ。
0437デフォルトの名無しさん
2009/04/23(木) 03:07:270438デフォルトの名無しさん
2009/04/23(木) 03:08:160439デフォルトの名無しさん
2009/04/23(木) 03:57:020440デフォルトの名無しさん
2009/04/23(木) 04:05:070441デフォルトの名無しさん
2009/04/23(木) 08:26:54関数アドレスをコールの度にメモリ間接参照するのと
コールの度にフラグをメモリアクセスするのは、あまり変わらない
ブランチはブランチヒストリで予測されるだろうということで
0442デフォルトの名無しさん
2009/04/23(木) 10:27:08もし頻繁に呼ばれない関数なら、分岐予測のオーバーヘッドとかどうでもいい。
0443デフォルトの名無しさん
2009/04/23(木) 14:49:51今C言語の勉強中で
構造体配列をソートしたいのですが
どうしたらいいのかわかりません。
テキストに載ってるソート方法はみんなint型で
実際int型でソートしようとしても
要領の大きさが足らないとかでてきて…
で、かわりにintのところをstructにしてもエラーになっちゃって…
私の実行したいことは
構造体の中のint型の数だけを判断してソートして出力させたいんです。
よろしくお願いします(>_<)
0444デフォルトの名無しさん
2009/04/23(木) 14:51:210445デフォルトの名無しさん
2009/04/23(木) 14:54:360446デフォルトの名無しさん
2009/04/23(木) 15:03:090447デフォルトの名無しさん
2009/04/23(木) 15:08:25入れ替えのところを構造体の入れ替えにすればいいだけだろ。
0448デフォルトの名無しさん
2009/04/23(木) 16:28:36#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(struct data *, struct data *);
void printData(struct data *);
main()
{
struct data{
int no;
char food[12];
char eto[8];
char aisatsu[16];
};
struct data e[5] ={ {1, "すし", "ねずみ", "おはよう"},
{3, "たまごやき", "とら", "こんばんは"},
{4, "ステーキ", "うさぎ", "おかえりなさい"},
{5, "秋刀魚", "たつ", "おやすみなさい"},
{2, "やきうどん", "うし", "こんにちは"}
};
0449デフォルトの名無しさん
2009/04/23(木) 16:31:37int i;
int j, k;
int n = 5;
struct data swap;
for(i = 0; i < 5; i++){
printf("%2d %12s %8s %16s \n",e[i].no, e[i].food, e[i].eto, e[i].aisatsu);
printf("------------------------------------------\n");
}
for(j = 0; j < n-2; j++);{
for(i = j+1; i < n-1; i++);{
if(e[j].no > e[i].no){
swap("e+i, e+j");
}
}
}
printData(e);
}
0450デフォルトの名無しさん
2009/04/23(木) 16:35:04void swap(struct data *y, struct data *z)
{
int t;
t = *y;
*y = *z;
*z = t;
}
void printData(struct data *e)
{
int i;
for(i = 0; i < 5; i++)
printf("%d",e[i]);
printf("\n");
}
//これで終わりです//
0451デフォルトの名無しさん
2009/04/23(木) 16:37:230452デフォルトの名無しさん
2009/04/23(木) 16:49:400453デフォルトの名無しさん
2009/04/23(木) 16:59:01struct data swap;を消す
swap("e+i, e+j"); じゃなくてswap(e+i, e+j);
0454デフォルトの名無しさん
2009/04/23(木) 17:03:04出力されました!!!
だけど番号が昇順にならない…昇順にしたいんですけど
何が間違っているのでしょうか???
0455デフォルトの名無しさん
2009/04/23(木) 17:08:010456デフォルトの名無しさん
2009/04/23(木) 17:14:08それよりもfor文の後ろのセミコロンだ、これに騙されて時間かかっちまったw
0457デフォルトの名無しさん
2009/04/23(木) 17:14:55for(i = j+1; i < n; i++){
if(e[j].no > e[i].no){
swap(e+i, e+j);
}
}
}
こうだな
0458デフォルトの名無しさん
2009/04/23(木) 17:14:58ご迷惑をおかけしました
ありがとうございました!!!
0459デフォルトの名無しさん
2009/04/23(木) 17:18:15本当にありがとうございました!!!!
0460デフォルトの名無しさん
2009/04/23(木) 17:20:24自己解決しました
ありがとうございました!!
0461デフォルトの名無しさん
2009/04/23(木) 17:23:130462デフォルトの名無しさん
2009/04/23(木) 17:54:060463デフォルトの名無しさん
2009/04/23(木) 19:06:49「そうだよねー!!」と合唱してる感じだ
0464デフォルトの名無しさん
2009/04/23(木) 19:23:320465デフォルトの名無しさん
2009/04/23(木) 19:26:14園児が大人達の会話にまざれなくて、かまって欲しくて奇行に走ってるのほうがふさわしいだろw
0466デフォルトの名無しさん
2009/04/23(木) 23:30:48深夜の公園で全裸になり「裸で何が悪い!」と叫び続けたアイドル
【横綱】
磐田市内の県立高に侵入、女子生徒のスク水着て脱糞
【大関】
女子高生の上履きを盗み、コンビニでコピーしたものを見て楽しむ
19〜71歳女性に一瞬で精液をかける18歳少年「早撃ちマック」
「セーラームーン」のコスプレで女性に近づき網タイツ越しに下半身を露出
改造した釣竿を使い、足掛け30年で500枚もの女性下着を盗み続けた
【関脇】
ブルマー持参で小学校侵入、「学校ではくと快感」
女性宅に侵入し何も盗らずPCのスクリーンセーバーをエロ画像に変えた男
京阪電鉄の特急電車内で男が幼虫200匹バラまく。「驚く女性客見たかった」
【破門】
10年以上に渡り女児パンツを履いては近隣の家に投げ込んでた男。
ストッキングと女児用パンツを組み合わせる独特の手法にこだわりを見せ、
取り調べに対しても悪びれることなく「女性の下着は密着感が気持ちいい。」という名言を吐き一気に番付を駆け登る。
しかし過去に殺人事件や巨額の横領事件を起こしていたことが発覚。
再逮捕され、「変態道から外れた外道」と非難され破門。
2008年9月27日、大阪拘置所にて自殺。
【外国人力士】
深夜にオムツだけを着て女性に「このへんにオムツ交換室はありませんか?」と尋ねる男(イギリス)
0467デフォルトの名無しさん
2009/04/24(金) 07:04:43ほぼ定型なのでマクロ化しようと思ってるんですが下記のような
場合はどうすればいいでしょうか?
HOGE* ptr = HOGELIST();
while(ptr)
{
何かの処理
ptr = HOGELIST();
}
マクロ化したいのは「何かの処理」の前後になります。
複数行かけるマクロで書いてみたのですが暴走してるようなので
本来のロジックのように展開されてないようです。
{}をマクロ内部できっちり閉じない場合は何かおまじない?をする必要があるんでしょうか?
0468デフォルトの名無しさん
2009/04/24(金) 07:22:46マクロはすべて一行に収めないといけない
複数行になる場合は行末に \ を書けば
次の行は前の行の続きとして扱われる
でも、マクロに変更しても処理速度UP効果はほとんど無い
そんなことよりもアルゴリズムを見直したほうが有意義だ
0469デフォルトの名無しさん
2009/04/24(金) 07:28:15処理速度の向上といよりは手間ですね
関数の引数をはしょってますがこの関数で複数管理してるリストのリードが
できるようになってまして、その手間を省くために作成しようとおもってます。
一応実際というか理想は
#define HOGE_MAE (a) {\
HOGE* ptr = HOGELIST(a);\
while(ptr)\
{\
}
#define HOGE_ATO (a) {\
ptr = HOGELIST(a);\
}\
}
という感じで定義しておいて
HOGE_MAE(A_LIST)
何かの処理
HOGE_ATO(A_LIST)
としてます。
0470デフォルトの名無しさん
2009/04/24(金) 07:29:18A_LISTもdefineで定数が設定されてます。
リスト識別子とでも言えばいいんでしょうか
0471デフォルトの名無しさん
2009/04/24(金) 07:37:10引数付マクロにしたければ丸括弧の前にスペースをいれては駄目
0472デフォルトの名無しさん
2009/04/24(金) 07:44:14すみません
ここに記述する際に手打ちでやったのでいれてしまいましたが
実際は入ってません
0473デフォルトの名無しさん
2009/04/24(金) 07:55:44中括弧の位置を間違ってるんじゃないの?
「手打ちだから間違えたけど実際は入ってない」とか
エスパーじゃないからわかんね
マクロでできるのは間違いないとしかいえないな
0474デフォルトの名無しさん
2009/04/24(金) 08:56:220475デフォルトの名無しさん
2009/04/24(金) 09:07:530476デフォルトの名無しさん
2009/04/24(金) 09:12:36それに、マクロの使い方を間違えたら泣けないバグが発生しそうだ。
0477デフォルトの名無しさん
2009/04/24(金) 10:53:46それをやるんだったら、「何かの処理」を関数化して、
リスト検索の関数の引数として渡したほうがいい。
0478デフォルトの名無しさん
2009/04/24(金) 15:10:52「*」(アスタリスク)が出てきた時にそれが
乗算演算子か間接参照演算子かポインタ変数宣言の記号かを判別する手順を教えてください。
0479デフォルトの名無しさん
2009/04/24(金) 15:23:50状況設定がなさ過ぎで無理な気がするけど。
誰かエスパー頼む。
0480デフォルトの名無しさん
2009/04/24(金) 15:34:05int* a;
int INT;
int b;
INT* c;
0481デフォルトの名無しさん
2009/04/24(金) 15:34:48int* a;
int INT;
int b;
INT* b;
0482デフォルトの名無しさん
2009/04/24(金) 16:06:08本気でやるなら、コメントやリテラル内での出現の場合も考慮する必要があるから
コンパイラ並のトークン解析処理を実装することになる。
0483デフォルトの名無しさん
2009/04/24(金) 16:07:340484デフォルトの名無しさん
2009/04/24(金) 16:33:45リンクリストについて今勉強中なんですけど
リンクリストのことを簡単に言うとどんな役割なんですか?
頭弱いんでほんとに簡単にお願いします。
どのテキスト読んでもよくわかんなくて…
よろしくお願いします。
0485デフォルトの名無しさん
2009/04/24(金) 16:36:230486デフォルトの名無しさん
2009/04/24(金) 16:54:54ひとつの関数内に2つ以上のreturn文があるのはよくないですか?
もしそうならその理由もお教えください。
自分としては問題ないと考えてますが・・・
0487デフォルトの名無しさん
2009/04/24(金) 16:56:59良いだろ別に、その人が制御出来ていれば。
変にフラグ変数とかgotoとかを乱発されるよか、returnが複数ある方がよっぽど良いと思うがね。
0488デフォルトの名無しさん
2009/04/24(金) 16:59:06ありがとう。もっともですよね?
gotoで関数のケツにある一括エラー処理に落とすのも無問題ですよね?
0489デフォルトの名無しさん
2009/04/24(金) 17:24:27Numerical Recipesを使って数値計算(runge kutta)のプログラムを組んだのですが、コンパイルは通ってもexeファイルが動きません。
どこかおかしいところがないか見ていただけないでしょうか。
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#define NRANSI
#include "nrutil.h"
#define N 2
#define dist 0.01
#define M 100
void derivs(float x,float y[],float dydx[])
{
dydx[1] = y[1];
}
void main(void)
{
double t;
float y[N],dydx[N],x=1.0,yout[N];
int j,i;
derivs(x,y,dydx);
scanf("%f",&y[1]);
for(j=0;j*dist<M;j++){
t=j*dist;
rk4(y,dydx,1,x,t,yout,derivs);
printf("%f\n",yout[1]);
}
}
0490デフォルトの名無しさん
2009/04/24(金) 17:27:55nrutil.hは?
0491デフォルトの名無しさん
2009/04/24(金) 17:30:18Numerical Recipesのインクルードファイルです。分割コンパイルしてあるのでわかりづらくてすみません。
もうひとつのファイルを貼り付けているので少しお待ちいただければと思います。
0492デフォルトの名無しさん
2009/04/24(金) 17:32:07Numerical Recipes って製品みたいだな。 ttp://www.nr.com/
>>489
言語・文法の問題より、(仕様を含めての)ラブラリ利用法の話っぽいので
ここでは回答得られないかも? 適切な場所はワカラン
0493デフォルトの名無しさん
2009/04/24(金) 17:34:20#define NRANSI
#include "nrutil.h"
void rk4(float y[], float dydx[], int n, float x, float h, float yout[],
void (*derivs)(float, float [], float []))
{
int i;
float xh,hh,h6,*dym,*dyt,*yt;
dym=vector(1,n);
dyt=vector(1,n);
yt=vector(1,n);
hh=h*0.5;
h6=h/6.0;
xh=x+hh;
for (i=1;i<=n;i++) yt[i]=y[i]+hh*dydx[i];
(*derivs)(xh,yt,dyt);
for (i=1;i<=n;i++) yt[i]=y[i]+hh*dyt[i];
(*derivs)(xh,yt,dym);
for (i=1;i<=n;i++) {
yt[i]=y[i]+h*dym[i];
dym[i] += dyt[i];
}
(*derivs)(x+h,yt,dyt);
for (i=1;i<=n;i++)
yout[i]=y[i]+h6*(dydx[i]+dyt[i]+2.0*dym[i]);
free_vector(yt,1,n);
free_vector(dyt,1,n);
free_vector(dym,1,n);
}
#undef NRANSI
nrutil.hはこちらのプログラム中にある、〜vectorを定義しています。中身は単純に配列取ってるだけだと思います。
0494デフォルトの名無しさん
2009/04/24(金) 17:40:23やはりライブラリの利用法になるのでしょうか・・・。
解説書を見てもやっている数式の説明ばかりで具体的な使用法が載っておらず困っていたのです。
アドバイスありがとうございました。
あと、スレ違いでしたら申し訳ありません。
0495デフォルトの名無しさん
2009/04/25(土) 09:36:24「exeファイルが動きません。 」って何かエラーメッセージが出てない?
DLLや共有ライブラリにパスが通ってないとかでは
0496デフォルトの名無しさん
2009/04/25(土) 10:52:49有効ということになり変換作業していたのですが特定の箇所でフリーズするため
調査したところ0で割っていたことがわかりました。
doubleのときは問題なかったのですがfloatにしたことで起きるというのは
やはり桁の問題なのでしょうか?
double = 0;
は実は0.000000000000000・・・・1とかなんでしょうか?
0497496
2009/04/25(土) 10:54:01double HOGE = 0;
とした際のHOGEの中は・・・
ですね失礼しました
0498デフォルトの名無しさん
2009/04/25(土) 11:15:440を入れたら0だよ。
誤差で0以外が入るってなさそう。
0499デフォルトの名無しさん
2009/04/25(土) 11:46:22元(doubleのとき)からのバグか、変換作業中のミスじゃないの。
いずれにしても、生半可な知識でfloatにしても速くなるとは限らないけどね。
一つだけヒント。floatにすると、doubleへの暗黙の型変換が発生するかもしれない点に注意。
例えばfloat foo = bar + 0.1;なんて書くと、とっても遅い型変換が二回も発生してしまう。
0500496
2009/04/25(土) 12:02:02うーん・・・
ソース全体のdoubleをfloatに置換して問題が発生してるところの
変数だけdoubleにするとフリーズ無しで、floatにするとフリーズ
という不可解な・・・
物理演算のちょっとしたソースなんですが元はwindows上で動いてた物を
どちらかといえば組み込み系のCPUに持ってきてるんですがやはりdoubleの
ほうが計算速い構造なんですかね?
0501デフォルトの名無しさん
2009/04/25(土) 12:07:150503デフォルトの名無しさん
2009/04/25(土) 12:29:26doubleとfloatとどっちが速いかは環境による。
(PCでやるときは、サイズが問題になるとき意外はdoubleをつかっとけば
いいと思うけど)
実測するか確かな資料にあたるかしたほうがいい。
0504489
2009/04/25(土) 12:46:28遅レスですみませんorz
共有ライブラリborlandC++/Cはcw32.libとimport32.libを加えています。
これでいいのかどうかいまいち自信はもてませんが大丈夫だと思っています。
DLLについてはコンパイラが勝手にやってくれるものだと・・・。ちょっとググってきます。
0505489
2009/04/25(土) 12:55:45runge4-2.exe:runge4-2.obj rk4.obj nrutil.obj
ILINK32 /ap /w- /x /C runge4-2.obj rk4.obj nrutil.obj cw32.lib import32.lib
runge4-2.obj:runge4-2.c
bcc32 -c -w- -Od runge4-2.c
rk4.obj:rk4.c
bcc32 -c -w- -Od rk4.c
nrutil.obj:nrutil.c
bcc32 -c -w- -Od nrutil.c
と、こんなかんじで作りました。DLLと共有ライブラリどちらも問題ないと思っています。
0506デフォルトの名無しさん
2009/04/25(土) 13:04:18フリーズするのは組み込み系のCPUでの話?
それだと使っているコンパイラにも拠るのでなんとも判らん。
そもそも実数なら0割り算で一一フリーズしないから、その変数のサイズに依存したコードでもあるかもね。
いずれにしても、どうしても高速化したいならアセンブリ出力を読めるくらいの知識が欲しいところだ。
0507デフォルトの名無しさん
2009/04/25(土) 16:12:29えーとですね、"exeが動きません"ていうのが何を指してるのか分からないのですよ
runge4-2.exe を実行すると、何もメッセージが出ずにプロンプトに戻るとか
エラーダイアログが出るとか。
そうじゃなくて、実行結果(printfの出力)が期待と違うというのなら、
>>492 のいうように言語・環境の問題じゃないので、専門家を召還するしかない
0508デフォルトの名無しさん
2009/04/25(土) 17:08:571バイトのデータごとに出現回数を見て、頻度の高いものから2進数の符号を
割りあてるようにしようと思っています。
置換後の符号をそれぞれ
0, 10, 110, 1110, 11110, 111110, 1111110, 11111110, 11111111
とすると1バイトでは上記の9通りのデータしか置換できませんが
残りのデータはどうするんでしょうか。
0509デフォルトの名無しさん
2009/04/25(土) 17:22:222バイト以上使えばよい
0510デフォルトの名無しさん
2009/04/25(土) 18:11:510511デフォルトの名無しさん
2009/04/25(土) 19:14:11byte* return_buf={次符号参照の記号,頻度最大の値,頻度最大の値-1,・・頻度最大-7の値,{入力の符号化},次符号参照の記号,頻度最大-8の値,・・頻度最大-15の値,{入力の符号化}次符号参照の記号,頻度最大-16の値,・・};
殆どの場合酷いことになるが。
0512デフォルトの名無しさん
2009/04/25(土) 20:24:00組み込み型ですか?
0513デフォルトの名無しさん
2009/04/25(土) 20:25:550514デフォルトの名無しさん
2009/04/26(日) 02:36:300515デフォルトの名無しさん
2009/04/26(日) 09:42:460516489
2009/04/26(日) 12:46:48なるほど。肝心な部分が抜けていたようですみませんでした。
runge4-2.exeを実行するとscanfすら実行せずにエラーで強制終了します。
出力先を指定してもなにも返さない(値が入っていない)のでプログラム自体がまったく動いていないのだと思います。
エラー報告の詳細にはAppver:0.0.0.0 Modver:0.0.0.0 Offset:00001017と出ていました。
要領を得ない説明で申し訳ないです。これでどうでしょうか。
0517デフォルトの名無しさん
2009/04/26(日) 23:53:39C言語はじめてみて、日付の演算がもの凄く面倒に感じました。
(1ヶ月先の日付等を取得する場合などに、
年越しでの年+1や閏年なんかはデフォルトでは判定してくれないようなので)
みなさんはやはりラッパ書かれて対処されているのでしょうか?
0518デフォルトの名無しさん
2009/04/27(月) 00:04:04C#とかC++とかでいいじゃない。
というのはあんまりだけど、とりあえずmktimeはある程度考慮してくれたはず。
0519デフォルトの名無しさん
2009/04/27(月) 01:13:06小学生の問題みながら作ってみたんですが、うまく作動しません。
もしかしたら根本的に間違えてるかもです。
指摘おねがいします。
main(){
int a,n,y,x;
scanf("%d%d%d",&a,&n,&y);
x=y-a*n;
printf("%d\n",x);
}
0520デフォルトの名無しさん
2009/04/27(月) 01:14:290521デフォルトの名無しさん
2009/04/27(月) 01:32:000522デフォルトの名無しさん
2009/04/27(月) 01:40:180523デフォルトの名無しさん
2009/04/27(月) 03:48:49えと、X=Y-A×N
の計算をやらせたいのですが、なにも表示されません。エラーの表示もでません。
空白です。
つかってるのはめじろってやつです。
0524デフォルトの名無しさん
2009/04/27(月) 03:51:02えっと、
A円のものをN個買いました。
Y円で支払いをしました。
おつりはX円になるか求めよ。
ってのを作ったつもりなんです。
0525デフォルトの名無しさん
2009/04/27(月) 03:54:06キーボードで入力はしたのか?
0526デフォルトの名無しさん
2009/04/27(月) 04:14:48といいますと・・・?
メモ帳で作成したのを、メジロで実行しております。
文字列やその他は間違えていませんか?
0527デフォルトの名無しさん
2009/04/27(月) 04:36:550528デフォルトの名無しさん
2009/04/27(月) 09:11:340529デフォルトの名無しさん
2009/04/27(月) 09:33:360530デフォルトの名無しさん
2009/04/27(月) 09:44:010531デフォルトの名無しさん
2009/04/27(月) 09:46:080532デフォルトの名無しさん
2009/04/27(月) 09:58:03ググったけどよく分からんかった
0533デフォルトの名無しさん
2009/04/27(月) 10:36:570534デフォルトの名無しさん
2009/04/27(月) 10:48:19int main(void) {
・
・
・
}
0535デフォルトの名無しさん
2009/04/27(月) 10:49:16>>519そのまま実行して、
14 5 1000(リターン)
で
930
と表示されたが
0536デフォルトの名無しさん
2009/04/27(月) 12:36:01何も表示されないのがいやなら
printf("1個の値段を入力:");
scanf("%d", &a);
printf("個数を入力:");
scanf("%d", &n);
printf("所持金を入力:");
scanf("%d", &y);
とかしろ
0537デフォルトの名無しさん
2009/04/27(月) 19:48:236桁の16進数で入力されたカラーをRGBに分解して表示するプログラムを作成しましょう。
int color, r, g, b;
scanf("%6X", &color);
r=[空欄] ([空欄]);
g=[空欄] ([空欄]);
b=[空欄] ([空欄]);
printf("RGB(%d,%d,%d)\n", r, g, b);
return 0;
0538デフォルトの名無しさん
2009/04/27(月) 20:04:32g=RGB_GETGREEN( color );
b=RGB_GETBLUE( color );
RGB_GETRED(rgb) (((rgb) >> 16) & 0xff)
RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
RGB_GETBLUE(rgb) ((rgb) & 0xff)
0539デフォルトの名無しさん
2009/04/27(月) 20:09:28俺なら
r = (color >> 16) & 0xFF;
g = (color >> 8) & 0xFF;
b = (color >> 0) & 0xFF;
にする
0540デフォルトの名無しさん
2009/04/27(月) 21:32:510541デフォルトの名無しさん
2009/04/27(月) 22:23:57scanf()の前で死ぬというのは不可解だけど、
rk4()の5番目の引数が >>489 と >>493 で違っている。
いずれにせよ >>489 のソースに rk4のプロトタイプ宣言を入れたほうがいい。
あと、>>489 の scanf と derivs の呼び出しは順番が逆じゃないかね
これじゃ不定値を dydx[1] にコピーしちゃう。
0542デフォルトの名無しさん
2009/04/27(月) 22:26:04int a = INT_MAX;
a += 1;
unsigned int b = UINT_MAX;
b += 1;
aの方は0にならないというか未定義だと思うんだけど、
bの方も未定義になる?
bは0になるんじゃないかと思ってるんだけど実は処理系依存とかだったりする?
0543デフォルトの名無しさん
2009/04/27(月) 22:29:05まあこちらに関しては未定義だと思うからあんまり意味は無いけども。
0544ごすけ
2009/04/27(月) 22:30:40/*引数n(<=1000)の入力に対して1~nの間の素数をすべて求めて、
コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/
を、for文を使ってお願いします。
0545デフォルトの名無しさん
2009/04/27(月) 22:31:17符号付き整数がオーバーフローした場合は未定義動作だが、
符号なし整数が範囲外にでたときは、
(MAX+1)を何回か足したり引いたりして範囲内になるようにした値になることになってる。
0546デフォルトの名無しさん
2009/04/27(月) 22:31:33ググれ
0547デフォルトの名無しさん
2009/04/27(月) 22:31:53宿題スレいけ
0548デフォルトの名無しさん
2009/04/27(月) 22:36:49だいたいそれぐらい出来なくて将来どうする気だ
働く先がないぞ。
0549デフォルトの名無しさん
2009/04/27(月) 22:36:53エ***ふるい
0550ごすけ
2009/04/27(月) 22:41:37ググりました。引数は見つからなかったんです。
私の将来、これからなんで。
ご丁寧にありがとう。
0551デフォルトの名無しさん
2009/04/27(月) 22:42:04レスありがとうございます。
一つよくわからないんですがこの場合は必ずある特定値になるんでしょうか?
それとも単に範囲内に収まるって事だけが決められていて、
0〜UINT_MAXの値ならどれでも取りうるってことでしょうか?
例えばintが32ビット長なら計算結果の下位の32ビットがbに入ってるとは限らないのでしょうか?
0552デフォルトの名無しさん
2009/04/27(月) 22:46:080553デフォルトの名無しさん
2009/04/27(月) 22:47:110554デフォルトの名無しさん
2009/04/27(月) 22:48:51unsigned intの取り得る値は(UINT_MAX+1)個しかないから、
ある範囲外の値に(UINT_MAX+1)の整数倍を足して得られる
範囲内の値はただ一つに定まる。
ただし、(UINT_MAX+1)が2の冪乗である保証はどこにもないので、
下位ビットにそのままなるとは限らない。
0555542
2009/04/27(月) 22:57:01上司からこれは未定義といわれてしまって納得がいかなかったので質問させていただきました。
>ただし、(UINT_MAX+1)が2の冪乗である保証はどこにもないので、
>下位ビットにそのままなるとは限らない。
たしかにこれはそうですね。
ただ今の環境だとUINT_MAX+1は2のべき乗なのでこれに関しては大丈夫そうです。
0556デフォルトの名無しさん
2009/04/27(月) 22:59:16str.find("hoge") == -1
という比較が出来る。
左辺は、unsignedだが。
0557デフォルトの名無しさん
2009/04/27(月) 23:01:18変なスレタイだけど、次からこっちいくといいよ
【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc12.2ch.net/test/read.cgi/tech/1201153965/
0558デフォルトの名無しさん
2009/04/27(月) 23:08:08それは厳密には環境依存なので、正しくはnposと比較すべきです。
0559489
2009/04/27(月) 23:20:46レスありがとうございます。
たしかにプロトタイプ宣言が抜けていました。基本的なミスとはorz
関数宣言での変数は関数の型宣言だけで中身は何でもいいのかと思っていました。こちらも改善します。
また、derivesの値もたしかに不定のままになっていました。
なぜかまだ動かないままなのでなんともいえませんが、プログラムがかなり改善できたと感じます。
ご助言ありがとうございました。
0560デフォルトの名無しさん
2009/04/28(火) 01:28:120561デフォルトの名無しさん
2009/04/28(火) 01:55:55エスパーで
ファイルの先頭に
#pragma comment(lib,"libjpeg.lib")
を置いてみたら?
0562デフォルトの名無しさん
2009/04/28(火) 23:26:140には割り当てず、8通り以外のデータは0の次に持ってくる方法にしました
(勉強のため圧縮率は考えていません)。
時間をかけて何度もデバッガを使いながら実装してみたのですが、
多くの文字については復号できているのです
(zip内のdata.txtがオリジナル、huffman.txtが復号したものです)が
バイナリエディタかvim等で見て頂ければわかる通り、
一部の文字が0x00になってしまい、正しく復号できません。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9110.zip
ご教示お願いします。
0563デフォルトの名無しさん
2009/04/29(水) 00:13:000564デフォルトの名無しさん
2009/04/29(水) 00:19:16これを大きいものから順に並べてjyuni[5]の配列に入れたいと思っています。
jyuni[5]={50,40,30,20,10}となるように格納するのではなく、pointの何番目が一番大きいという形で格納したいのですが。
今回の場合で言うと、jyuni={1,3,4,2,0}となって欲しいのですが、このような処理はどうやったら良いでしょうか?
わかりにくいかと思うのですが、よろしくお願いします
0565デフォルトの名無しさん
2009/04/29(水) 01:23:21{ {10,0},{50,1},{20,2},{40,3},{30,4}}
をソートして
{{50,1},{40,3},{30,4},{20,2},{10,0}}
とするとお望みのことが出来るのでは?
0566デフォルトの名無しさん
2009/04/29(水) 01:42:02point[5]={10,50,20,40,30}
...
//ソート関数中のスワップ部分
tmp = point[i];
point[i] = point[j];
point[j] = tmp;
...
//ソート後
point[5]={50,40,30,20,10}
↓
//ソート前
point[5]={10,50,20,40,30}
index[5]={0,1,2,3,4}
...
//ソート関数中のスワップ部分
tmp = point[i];
point[i] = point[j];
point[j] = tmp;
tmp = index[i];
index[i] = index[j];
index[j] = tmp;
...
//ソート後
point[5]={50,40,30,20,10}
index[5]={1,3,4,2,0}
0567デフォルトの名無しさん
2009/04/29(水) 01:59:22pointの中身は動かしたくないのですが・・・・できませんか?
0568デフォルトの名無しさん
2009/04/29(水) 02:09:180569デフォルトの名無しさん
2009/04/29(水) 02:12:15#include <stdio.h>
int main(void)
{
int i, j, point[5] = {10,50,20,40,30}, jyuni[5];
for(i=0; i<5; i++) {
for(j=i; j> 0; j--) {
if(point[i] < point[jyuni[j-1]]) break;
jyuni[j] = jyuni[j-1];
}
jyuni[j] = i;
}
for(i=0; i<5; i++) printf("%d ", jyuni[i]);
return 0;
}
0570デフォルトの名無しさん
2009/04/29(水) 02:24:03#include <stdio.h>
int main(void)
{
int i, j, point[5] = { 10, 50, 20, 40, 30}, jyuni[5] = { 0, 1, 2, 3, 4};
for(i=4; i> 0; i--) {
for(j=0; j<i; j++) {
if(point[jyuni[j]] < point[jyuni[j+1]]) {
int temp = jyuni[j];
jyuni[j] = jyuni[j+1];
jyuni[j+1] = temp;
}}}
for(i=0; i<5; i++) printf("%d ", jyuni[i]);
return 0;
}
0571デフォルトの名無しさん
2009/04/29(水) 02:34:010572デフォルトの名無しさん
2009/04/29(水) 05:09:47#include <stdlib.h>
int point[5] = {10, 50, 20, 40, 30};
int jyuni[5] = { 0, 1, 2, 3, 4};
int cmp(const void *s1,const void *s2)
{
int *p1 = (int *)s1;
int *p2 = (int *)s2;
if(point[*p1] == point[*p2])return 0;
else if(point[*p1] < point[*p2])return 1;
else return (-1);
}
main()
{
qsort(jyuni,5,sizeof(int),cmp);
}
0573デフォルトの名無しさん
2009/04/29(水) 05:20:16>>567
0574デフォルトの名無しさん
2009/04/29(水) 05:29:03バカ発見
0575デフォルトの名無しさん
2009/04/29(水) 05:45:08コントローラーの状態正しく取得するには
・ProcessMessage()もしくはRenewInput()を一定サイクルで呼び出す。
・上記処理の後でGetJoypadInputState()もしくはGetInputState()でボタン別の情報を取得
としないとだめです。
ProcessMessage()の中でRenewInput()を呼び出していますので
下記部分を崩してなければ取得はできるはずなんですが・・・・
//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}
int main()
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessLoop()==0)
{//メインループ
0576デフォルトの名無しさん
2009/04/29(水) 05:45:490577デフォルトの名無しさん
2009/04/29(水) 09:07:16pointの中身を動かしたくなければpointの配列へのポインタを
作ってそちらをソートすればよかろう
0578デフォルトの名無しさん
2009/04/29(水) 09:25:34と思うよ。
0579デフォルトの名無しさん
2009/04/29(水) 09:47:02#include<stdio.h>
#include<stdlib.h>
int cmp(const void *x, const void *y)
{
int * const *a, * const *b;
a=x;
b=y;
if(**a>**b) return -1;
return **a<**b;
}
int main(void)
{
int point[5] = {10, 50, 20, 40, 30};
int *p_point[5], jyuni[5], i;
for(i=0;i<5;i++) p_point[i]=&point[i];
qsort(p_point, 5, sizeof(int*), cmp);
for(i=0;i<5;i++) jyuni[i]=p_point[i]-point;
for(i=0;i<5;i++) printf(" %d", jyuni[i]);
return 0;
}
0580デフォルトの名無しさん
2009/04/29(水) 10:02:05int cmp(const void *s1,const void *s2)
{
return point[*(int *)s1] - point[*(int *)s2];
}
0581デフォルトの名無しさん
2009/04/29(水) 14:45:45不定な値が入っていることはないんでしょうか?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
str = malloc(8);
printf("'http://pc12.2ch.net/test/read.cgi/tech/1238087817/l50'", str);
return 0;
}
以上ソースをcompileして1万回実行してみたんですが、変な文字列が出力されることはありませんでした。
しかし、man malloc を読むと"The memory is not cleared"と書かれており、
環境によっては不定な値が出力されたりするのか心配です…
* 環境
コンパイラ: gcc-4.3.2 ($ gcc -Wall hoge.c -o hoge とcompileしました)
OS: Linux (Debian-Lenny)
0582デフォルトの名無しさん
2009/04/29(水) 14:48:32たとえば、どこかでメモリ使ったあとfreeして
その場所がまたmallocで割り当てられたら?
0583581
2009/04/29(水) 14:49:40---
mallocで確保したメモリーは必ずNULLで埋められているものなのでしょうか?
不定な値が入っていることはないんでしょうか?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
str = malloc(8);
printf("%s", str);
return 0;
}
※以下581に同
0584デフォルトの名無しさん
2009/04/29(水) 14:53:38検証プログラムがワルワルだな。
もっとしっかり検証汁
0585デフォルトの名無しさん
2009/04/29(水) 14:54:29確保したメモリが'\0'でクリアされている保証があるのはcalloc()のみ
malloc()はローカル変数と同じで不定値
0586デフォルトの名無しさん
2009/04/29(水) 14:55:29たまたま埋まってる場合もあるけど、ほとんどは埋まってないはず。
mallocで確保したエリアはmemsetなどでクリアするのが普通です。
0587デフォルトの名無しさん
2009/04/29(水) 15:02:29わざわざbcopy() するのですかねえ。
0588デフォルトの名無しさん
2009/04/29(水) 15:05:36新しいプログラムでは memcpy() や memmove() を使用すべきである。
memcpy() や memmove() では、最初の 2 つの引数の順序が入れ替わっていることに注意すること。
POSIX.1-2008 では、 bcopy() の仕様が削除されている。
0589デフォルトの名無しさん
2009/04/29(水) 15:16:52#include <stdio.h>
#include <stdlib.h>
#define TEST_SIZE 100000
main()
{
unsigned char *test;
int i;
test = (unsigned char *)malloc(TEST_SIZE);
for(i = 0;i < TEST_SIZE;i++){
test[i] = i % 0x100;
}
free(test);
test = (unsigned char *)malloc(TEST_SIZE);
for(i = 0;i < TEST_SIZE;i++){
if(test[i]){
printf("%7d %2x\n",i,test[i]);
}
}
}
0590デフォルトの名無しさん
2009/04/29(水) 15:37:36なんでこんな余計なことするんだろw
0591デフォルトの名無しさん
2009/04/29(水) 15:38:130592581
2009/04/29(水) 15:43:27私の環境でもコンパイルして実行してみたんですが、エラーとかセグメンテーションフォールトが
でませんでした…たまたまかな…… gccでワーニングでないように以下のソースで実行してみました。
#include <stdio.h>
#include <stdlib.h>
#define TEST_SIZE 100000
int main()
{
unsigned char *test;
int i;
test = (unsigned char *)malloc(TEST_SIZE);
for(i = 0;i < TEST_SIZE;i++){
test[i] = i % 0x100;
}
free(test);
test = (unsigned char *)malloc(TEST_SIZE);
for(i = 0;i < TEST_SIZE;i++){
if(test[i]){
printf("%7d %2x\n",i,test[i]);
}
}
return 0;
}
0593581 (1/2)
2009/04/29(水) 15:44:23実は今、標準出力から文字列を読み込んで処理させるようとしています。
読み込む文字列の長さに応じて1KBづつreallocで文字列格納領域を拡張しながら
strncatで文字列をつなげようとしてるんですが、格納領域を最初にNULLで埋める
必要があるのかないのかどうか?迷っています。
realloc(NULL, n)はmalloc(n)と同等だと思うのですが、
reallocしてstrncatする前に、文字列格納領域の最初に'\0'を書き込んで置くべきでしょうか?
mallocの結果が不定だとすると初期化が必要なのかな?
以下は、検証用に標準出力から文字列を読み込んでそのまま表示させるソースです。
文字列格納領域(str)に、最初に'\0'を書き込んでおかなくても今のところ問題はないのだけど、
場合によっては不定な値になって問題出てくるのかな?
標準入力からの入力をつなげるときって、みなさんどうされてますか?
0594581 (2/2)
2009/04/29(水) 15:45:29#include <stdlib.h>
#include <string.h>
#define BLOCK 1024
int main(int argc, char *argv[])
{
char buf[BLOCK + 1];
char *str = NULL;
int n;
int size_str = 1;
/* str = malloc(1); */ ←この部分がいるのかいらないのか?
/* *str = '\0'; */
while (1) {
n = fread(buf ,1 , BLOCK, stdin);
if (n == 0) {
break;
} else if (n < 0) {
perror("fread");
return -1;
}
*(buf + n) = '\0';
size_str = size_str + n;
str = realloc(str, size_str);
strncat(str, buf, n);
}
printf("%s", str);
free(str);
return 0;
}
0595デフォルトの名無しさん
2009/04/29(水) 15:48:36その領域の値は不定値
要注意
0596581
2009/04/29(水) 15:51:13$ gcc -Wall test.c -o test
$ echo 'hoge...fuga' | ./test
hoge...
...
...fuga
のように検証しています。パイプで渡したデータを処理するプログラムが書きたい…
0597デフォルトの名無しさん
2009/04/29(水) 15:53:56最初の1バイト目に0を書き込んでおけばあとは何もいらんだろ。
0598デフォルトの名無しさん
2009/04/29(水) 16:10:36メイン関数から受け取った文字列の領域の長さを求める方法を教えてください
サブ関数の仮引数で(char* str)で受け取った場合とかsizeofでやると4の値が返ってきてしまいます
0599デフォルトの名無しさん
2009/04/29(水) 16:12:24while(*str++) len++;
0600デフォルトの名無しさん
2009/04/29(水) 16:12:54そりゃchar*であろうがポインタのサイズだからだよ
4バイトってことは32bitCPUかな?
strlenでいけると思うけど、関数を呼ぶ側がちゃんとstrlenが暴走しないような
文字列を送ってくれるならそれでいいけどそれ以外は長さをもらうとかしないと
検知はできないね
0601デフォルトの名無しさん
2009/04/29(水) 16:16:560602デフォルトの名無しさん
2009/04/29(水) 16:20:03ふむふむなるほどですね
でも例えばstr[10] = "abc";でstrlenを使うと3の値で返ってきてしまうんですよね
そうするとstrの変数の全領域の長さがわからなくなってしまう
サブ関数内でポインタ変数の指す領域の長さってどうやれば良いのかな?
やっぱり上位関数から長さも引数として与えなければいけないんですかね?
0603デフォルトの名無しさん
2009/04/29(水) 16:22:13>上位関数から長さも引数として与えなければいけないんですかね?
その通りです
そういうのが保証されるのが望ましいならCは無理ですね
0604デフォルトの名無しさん
2009/04/29(水) 16:25:53ありがとうございました!
大人しく引数を増やします
0605デフォルトの名無しさん
2009/04/29(水) 16:48:24struct simple_str {
int len;
char *str;
};
みたいなのを昔使ってたことはヒミツ
いまじゃStringです
0606デフォルトの名無しさん
2009/04/29(水) 16:57:500607デフォルトの名無しさん
2009/04/29(水) 17:03:37マネージド開発から流れてきてるのがいるのかね?
Cはぶっちゃけアセンブラにかぶせた皮程度だからほぼ自分で面倒見るしかないし
なんらかの安全のためのソフトウェアスタックをかぶせるくらいなら後発の言語使えば
いいだけだしなあ
0608デフォルトの名無しさん
2009/04/29(水) 17:05:03今ならそうだな、新入社員とか。
0609デフォルトの名無しさん
2009/04/29(水) 17:08:14何がされないかは、言語ごとにいつも戸惑うことになるのも事実。
0610デフォルトの名無しさん
2009/04/29(水) 17:11:25それは実行形式 PE とか elf を考えればおのずとわかるのでは
0611デフォルトの名無しさん
2009/04/29(水) 17:14:090612デフォルトの名無しさん
2009/04/29(水) 17:22:500613デフォルトの名無しさん
2009/04/29(水) 17:23:540614デフォルトの名無しさん
2009/04/29(水) 18:00:55malloc()で取った領域の初期化は、プロセスのメモリサイズ増えるし余計なお世話
0615デフォルトの名無しさん
2009/04/29(水) 18:14:27for( i = 0 ; i < 10 ; i++ ){
for( j = 0 ; j < 10 ; j++ ){
if( a[i] > a[j] ){ //iとjの数値は同じなので比較。
temp = a[i]; //tempにa[i]を格納
a[i] = a[j]; //a[i]にa[j]を格納
a[j] = temp; //先ほど格納したa[i]をa[j]に格納
}
}
}
これの1,2行目って同時に回してる訳じゃないよね?
そうだったらi=0とj=0の時、if文での比較で「同じ配列の数字」が判定されるんだよね?
i=1の時に、j=0と比べてるって事でいいんだよね?
初心者ですまんが、ここがどうしても分かりづらいから解説頼む。
0616デフォルトの名無しさん
2009/04/29(水) 18:18:230でメモリを初期化してるのかな?
0617デフォルトの名無しさん
2009/04/29(水) 18:24:22クラスや構造体の場合はコンストラクタの振る舞いに依ります。
0618デフォルトの名無しさん
2009/04/29(水) 18:24:29それバブルソートじゃないからw
0619デフォルトの名無しさん
2009/04/29(水) 18:26:23コンストラクタ、デストラクタを理解してください
0620デフォルトの名無しさん
2009/04/29(水) 18:28:05for( i = 0 ; i < 10 - 1 ; i++ ){
for( j = i + 1 ; j < 10 ; j++ ){
こうじゃないの?
0621デフォルトの名無しさん
2009/04/29(水) 18:31:39do{
flg = 0;
for( i = 0 ; i < 10 - 1 ; i++ ){
j = i + 1
if( a[i] > a[j] ){ //iとjの数値は同じなので比較。
temp = a[i]; //tempにa[i]を格納
a[i] = a[j]; //a[i]にa[j]を格納
a[j] = temp; //先ほど格納したa[i]をa[j]に格納
flg = 1;
}
}
}while(!flg);
いっそ こうだと思うよ
0622デフォルトの名無しさん
2009/04/29(水) 18:37:01それだと降順になった。
結局
for( i = 0 ; i < 10 - 1 ; i++ ){
for( j = i ; j < 10 ; j++ ){
でiとjは同じ数字でループしているのか
iの方が1多い数字でループしているのか
どっち?
0623デフォルトの名無しさん
2009/04/29(水) 18:39:010624デフォルトの名無しさん
2009/04/29(水) 18:39:280625デフォルトの名無しさん
2009/04/29(水) 18:41:040626デフォルトの名無しさん
2009/04/29(水) 18:44:30なんかバグっぽいけど、こんな感じです
0627デフォルトの名無しさん
2009/04/29(水) 19:23:41あーなるほど。
もの凄い分かりやすかったw
助かった、ありがとう
0628デフォルトの名無しさん
2009/04/30(木) 10:56:050629デフォルトの名無しさん
2009/04/30(木) 13:40:132
3 #define CONST_VAL 10.8
4 #define CONST_VAL2 (CONST_VAL*10)
5 #define CONST_STR "C Language"
6
7 int main(void){
8 printf("CONST_VAL = %g\n",CONST_VAL);
9 printf("CONST_VAL2 = %g\n",CONST_VAL2);
10 printf("CONST_STR = %s\n",CONST_STR);
11 return 0;
12 }
~ /*実行結果*/
CONST_VAL = 10.8
CONST_VAL2 = 108
CONST_STR = C Language
このとき10行目の%sを%gとすると、C Lanfuageのところが108と表示されます。
これはなぜなんでしょうか?ぼくの考えではでたらめな数字がでるか表示されない
と思ったんですが・・・詳しい方教えてください。
0630デフォルトの名無しさん
2009/04/30(木) 13:46:360631デフォルトの名無しさん
2009/04/30(木) 13:54:49たまたま、を除外するとなるとアセンブラ出力してみてるのが確実
うちはそうならんけどな
0632デフォルトの名無しさん
2009/04/30(木) 13:56:19出鱈目な数字がでて、予想通りじゃないか。
0633デフォルトの名無しさん
2009/04/30(木) 14:02:35コンピュータ初心者なので
環境といわれて何を答えたらいいかわかりません。すみません・・・
コンパイラーはgccです。
>>632
そうなんでしょうか?
数値からしてCONST_VAL2と何か関係があるような気がしてならないのですが・・・
0634デフォルトの名無しさん
2009/04/30(木) 14:04:190635デフォルトの名無しさん
2009/04/30(木) 14:05:29もしかすると関係しているかもしれないが、「未定義」とはそういうことも含めて出鱈目な動作になるってこと。
0636デフォルトの名無しさん
2009/04/30(木) 14:06:23どうして108になるか知りたければ、-Sつけてコンパイルしろ
0638デフォルトの名無しさん
2009/04/30(木) 14:10:43つかFP数を関数に渡すときはFPレジスタを使うという
APIで、直前に設定した108が上書きされず残っていた
ということだろう
0639デフォルトの名無しさん
2009/04/30(木) 14:13:14未定義動作のことをいっていたのですね。
回答ありがとうございました。
0640デフォルトの名無しさん
2009/04/30(木) 14:15:14回答ありがとうございます。
よくわからない単語がたくさんあるので調べます。
0641デフォルトの名無しさん
2009/04/30(木) 14:44:43>638を調べて理解しようとしない方がいいよ。今の段階ではそこまで意識する必要はないから。
0642デフォルトの名無しさん
2009/04/30(木) 14:58:16そうですね。
調べてもよくわかりませんでした。
初心者にはまだ早いようです。
0643デフォルトの名無しさん
2009/04/30(木) 19:02:41スレタイ的には俺に聞けだぜ?
>>642
待て。
それが分からないとC言語プログラミングは諦めた方がいいくらいの大事な事項ですよ。
未定義undefinedの動作ってのはつまり何がおきるか定義されていないってことです。
未定義undefinedの動作になるようなソースコードをコンパイラに渡した場合、
コンパイラは好き勝手なコードを出力していいよとC言語の仕様書にあるという意味です。
例えばその実行ファイル(Winなら.exe)を実行した次の瞬間に
君のPCが爆発してもおかしくない(C言語の使用に反していない)ってことです。
これを表すのに鼻から悪魔がでるという表現を使うこともあります。
0644デフォルトの名無しさん
2009/04/30(木) 19:05:150645デフォルトの名無しさん
2009/04/30(木) 19:18:16どうしたつぶやき。
0646デフォルトの名無しさん
2009/04/30(木) 19:20:35「未定義」であることだけ判ればいいと思うよ。
少なくとも、>638にあるような「FP数」だとか「API」だとか、
言葉の使い方もいい加減だし理解するべきことでもない。
0647デフォルトの名無しさん
2009/04/30(木) 19:22:45その辺の言葉を覚えるのは入門レベルの話じゃないと思った。
0648643
2009/04/30(木) 19:23:04俺もほぼ君に同意。
まあ未定義であるということは、
うまく動くかもしれないしとんでもないバグになるかもしれないということは
肝に銘じておいて欲しい。
それがC言語を扱う者のマナーというか命綱。
0649デフォルトの名無しさん
2009/04/30(木) 23:09:46FP=Floating Point
API = Application Interface
覚えて帰ってね
0650デフォルトの名無しさん
2009/04/30(木) 23:13:19Programming が抜けてるぞ
0651デフォルトの名無しさん
2009/04/30(木) 23:28:370652デフォルトの名無しさん
2009/05/01(金) 11:03:320653デフォルトの名無しさん
2009/05/01(金) 13:22:58背伸びするときくらいシャキっとせい
0654デフォルトの名無しさん
2009/05/01(金) 14:08:13http://www.google.co.jp/search?q=%22FP%E6%95%B0%22&lr=
引数の渡し方を"API"なんて普通言わない。
http://www.google.co.jp/search?q=API&lr=
0655デフォルトの名無しさん
2009/05/01(金) 15:42:310656デフォルトの名無しさん
2009/05/01(金) 16:02:46stdcallとかfastcallとか
0657デフォルトの名無しさん
2009/05/01(金) 16:06:24自分たちで作るコードが対外的に機能を提供する物であれば使ってもらうときに
APIと呼ばれるかもしれないけどねえ
でもAPIの場合はオプソでもなければブラックボックスだし
0658デフォルトの名無しさん
2009/05/01(金) 21:53:090659デフォルトの名無しさん
2009/05/01(金) 22:08:100660デフォルトの名無しさん
2009/05/01(金) 22:23:47/* hello.c */
#include<stdio.h>
int main(void){
double a,b,tasi,hiki,wari,kake;
scanf("%lf%lf",&a,&b);
tasi=a+b;
hiki=a-b;
wari=a/b;
kake=a*b;
printf("計:%f\n",tasi);
printf("差:%f\n",hiki);
printf("積:%f\n",kake);
if(b==0){
printf("0除算によるエラーです。。\n");
}else{
printf("商:%f\n",wari);
}
return 0;
こいつを作りました。
bが0ときにメッセージを出すつもりだったのですが、
間違った答えが出るわけでもなく、反応がないだけです。
どこを直せば大丈夫ですか?
0661デフォルトの名無しさん
2009/05/01(金) 22:25:420662デフォルトの名無しさん
2009/05/01(金) 22:35:40初心者にもわかりやすい本を教えて下さい。
0663デフォルトの名無しさん
2009/05/01(金) 22:36:12できました。
ありがとうございました。
0664デフォルトの名無しさん
2009/05/01(金) 22:38:59私も初心者なんですが、
本はよくわかりませんが、ニコニコの講座はおすすめできます。
ttp://www.nicovideo.jp/watch/nm6216304
最初のうちはこれでいいような気がします。
まぁまだそんなに詳しくはないのでわからないですが・・・
0665デフォルトの名無しさん
2009/05/01(金) 22:46:420666デフォルトの名無しさん
2009/05/01(金) 22:50:21初心者にこんなこと言うのもなんだがスレ違いだな
C言語を学ぼうとしているのに何故APIの本を買ったのかがわからない
0667デフォルトの名無しさん
2009/05/01(金) 22:50:370668デフォルトの名無しさん
2009/05/02(土) 08:57:060669デフォルトの名無しさん
2009/05/02(土) 10:04:14検索しても出てこないし
0670デフォルトの名無しさん
2009/05/02(土) 18:09:48なんのAPIなんだろうか?>>662
0671デフォルトの名無しさん
2009/05/02(土) 18:11:01まずはpcapとかcurlとか
0672デフォルトの名無しさん
2009/05/02(土) 20:40:51#include <stdio.h>
main ()
{
char *str[] = {"I","am","Tom"};
int i = 0;
for( ; *str[i] == '\0'; i++) {
printf("%s ",str[i]);
}
return 0;
こういうプログラムを作りまして、一応ビルドは通ったんですけど上手くいかないんです。
どこがおかしいんでしょうか?
よろしくお願いします。
0673デフォルトの名無しさん
2009/05/02(土) 20:52:160674デフォルトの名無しさん
2009/05/02(土) 20:54:14それと
char *str[] = {"I","am","Tom", ""};
のように最後に空文字列を付ける('\0')
0676デフォルトの名無しさん
2009/05/02(土) 22:18:34#include <stdio.h>
int main(void)
{
int fun,fin;
printf("2つの整数を入力してください。\n");
scanf("%d",&fun);
scanf("%d",&fin);
if(fun>fin)
{
printf("%dより%dのほうが大きい値です。\n",fin,fun);
}
else if(fun<fin)
{
printf("%dより%dのほうが大きい値です。\n",fun,fin);
}
else
{
printf("2つの数は同じ値です。\n",);
}
return 0;
}
なぜかコンパイルできないんですが、
どこが間違ってるんでしょうか?
0677デフォルトの名無しさん
2009/05/02(土) 22:20:23,が余分
0680デフォルトの名無しさん
2009/05/02(土) 22:31:55118関係ないです。
ちょっとあわててしまったなあ、もう。
0681デフォルトの名無しさん
2009/05/02(土) 22:41:4306821/1
2009/05/03(日) 04:11:09まだ起きてる方いましたら教えてください。
以下のプログラムで足し算を行いたいです。
/*電卓風味の足し算だよ*/
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d",&a);
scanf("%d",&b);
c=a+b;
printf("結果%d\n",c);
return 0;
}
このプログラムを↓に変える
0683デフォルトの名無しさん
2009/05/03(日) 04:12:36#include<stdio.h>
int main()
{
int a,b,c;
c=a+b;
scanf("%d",&a);
scanf("%d",&b);
printf("結果%d\n",c);
return 0;
}
scanfはユーザー側が入力することが出来るものですよね。
文法では間違っていないと思うんですが何が問題でしょうか?
分割にしないと改行が多すぎとはねられてしまうため分けました。
見にくかったらすみません。
0684デフォルトの名無しさん
2009/05/03(日) 04:32:29>>683はaもbも値が定まっていない(不定値)の状態で足しているから、cは意味不明な値になる。
だから>>683のほうは値を入力しても意味が無い。
0685デフォルトの名無しさん
2009/05/03(日) 04:37:37簡単にいうとプログラムは上から下に処理していく
↓
「a+bの入力をユーザーから入力してもらう方が先」
↓
だから「結果のc」を先に書いてもエラー
↓
になるってことですよね?
0686デフォルトの名無しさん
2009/05/03(日) 04:42:170687デフォルトの名無しさん
2009/05/03(日) 04:46:07初心者すぎて呆れちゃいますよね。すみませんでした。
0688デフォルトの名無しさん
2009/05/03(日) 04:52:31半分寝た状態で書き込んじゃっただけだから。
これからもその調子で頑張っていけばいいよ。
じゃ、眠いから寝るわ
0689デフォルトの名無しさん
2009/05/03(日) 08:54:04intなどは問題ないと思うのですが
0690デフォルトの名無しさん
2009/05/03(日) 09:34:27だめ。0を代入する。
0691デフォルトの名無しさん
2009/05/03(日) 10:29:430692デフォルトの名無しさん
2009/05/03(日) 12:25:11わかってやる分にはOKかと
ポインタを含む構造体を memset で 0初期化したりとかもよくある。
C++のオブジェクトみたいに得体の知れないものは完全にダメ
0693デフォルトの名無しさん
2009/05/03(日) 17:50:23という1バイトの変数があります。
各ビットごとに比較を行うにはどうしたらいいですか?
3ビット目が0ならば・・・みたいな感じです
0694デフォルトの名無しさん
2009/05/03(日) 17:52:10hoge & 0x02
hoge & 0x04
hoge & 0x08
hoge & 0x10
hoge & 0x20
hoge & 0x40
hoge & 0x80
こんな感じ
0695デフォルトの名無しさん
2009/05/03(日) 17:55:34if ((hoge & (1<<i)) != 0)
printf("bit %d is set\n", i);
}
0696デフォルトの名無しさん
2009/05/03(日) 17:59:20>>695
ありがとうございます。
1 << iとはどういうことですか? i >>1と等価ですか?
0697デフォルトの名無しさん
2009/05/03(日) 18:02:01ていうのはforでiを変えてその数字分左シフトしてます
つまり
i =0の場合1を0シフトするので1ビット目の調査をします
i =1の場合1を1シフトするので2ビット目の調査をします
0698デフォルトの名無しさん
2009/05/03(日) 18:07:24CHAR_BITってのは変数のビット数ですか?8ビット?
0699デフォルトの名無しさん
2009/05/03(日) 18:08:47この場合は変数じゃなくてdefineでcharの最大ビット数である8が入ってると
考えるのが普通かと
0700デフォルトの名無しさん
2009/05/03(日) 18:12:430701デフォルトの名無しさん
2009/05/03(日) 18:24:00charのビット数を表し、8以上の値であると決められている
0702693
2009/05/03(日) 19:46:20その2つの変数の各桁が一致してるのが何桁目みたいに表示するにはどうしたらいいですか?
0703デフォルトの名無しさん
2009/05/03(日) 20:28:00ごめんよくわからない
具体例を2,3個挙げて
0704デフォルトの名無しさん
2009/05/03(日) 20:31:220705デフォルトの名無しさん
2009/05/03(日) 20:32:281ビット変数じゃなくて1バイト変数だよな?
0706デフォルトの名無しさん
2009/05/03(日) 20:35:58>>704 わかりました。ありがとうございます
0707デフォルトの名無しさん
2009/05/03(日) 23:25:31#include <stdio.h>
int main(void)
{
int fun,i;
printf("いくつ*を出力しますか?\n");
scanf("&d",&fun);
for(i=1; i<=fun; i++)
{
printf("*");
}
printf("\n");
return 0;
}
えーとですね、数字を入力した数だけ「*」を出力させたいんですが、
「*」が1つしかでてくれません。
どのようにすればいいんでしょうか?
0708デフォルトの名無しさん
2009/05/03(日) 23:28:370710デフォルトの名無しさん
2009/05/03(日) 23:31:55118関係ないです・・・。
少し落ち着いたほうが良いな俺・・・。
0711デフォルトの名無しさん
2009/05/03(日) 23:39:29printfやscanfは勿論で
構造体とかポインタ、配列…
ぐらいしか思いつかない、他にやるべき事ある?
0712デフォルトの名無しさん
2009/05/04(月) 00:17:500713デフォルトの名無しさん
2009/05/04(月) 00:35:480714デフォルトの名無しさん
2009/05/04(月) 00:39:41scanf()はやらなくていいよ。
0715デフォルトの名無しさん
2009/05/04(月) 01:11:300716デフォルトの名無しさん
2009/05/04(月) 07:35:54sscanf()は使ってるコードけっこうない?ifconfigとか…
0717デフォルトの名無しさん
2009/05/04(月) 08:55:13それとも関数一つ一つ勉強するのか?
0718デフォルトの名無しさん
2009/05/04(月) 12:00:32scanf()はやらなくていよ。
0719デフォルトの名無しさん
2009/05/04(月) 13:03:12そこを理解して使え。scanfに限らず、その他のライブラリ、コードの書き方に於いても
もうそういった点はプログラマー、ユーザが気をつける点だろ。
内部を破壊するようなプログラムなんて、いくらでも書こうと思えば書ける。
0720デフォルトの名無しさん
2009/05/04(月) 15:32:07・挙動に習熟しても、入門レベルを脱したら使わない。
・他の関数で簡単に代替できる。
・scanf()を使うテキストで勉強してる初心者は、サンプルを
いじってちょっと複雑なコードを書こうとするとだいたいはまる。
0721デフォルトの名無しさん
2009/05/04(月) 16:21:00そしたらハマった
0722デフォルトの名無しさん
2009/05/04(月) 21:31:36XMLをDOMの木構造にしようと考えてて
とりあえずタグの解析(dom.c)を作ってみたんですが
開始タグと終了タグが(同じなのに)違うと出てしまいます。
デバッガで見ても同じ文字列なのにstrcmp()だと違うと返されます。
更に、el->TagNameは開始タグ、pは終了タグの文字列ですが
printf("Expected %s but %s.\n", el->TagName, p);
としたものが、" but Configuration.ion"と表示され意味不明な状態です。
どうすればいいでしょうか。
0723デフォルトの名無しさん
2009/05/04(月) 21:36:17駄目だしされたxmlは?
0724デフォルトの名無しさん
2009/05/04(月) 21:53:030725デフォルトの名無しさん
2009/05/04(月) 21:53:13同梱のvalid.htmlならうまくいくんですが。。。
0726デフォルトの名無しさん
2009/05/04(月) 21:56:19|| ch == 0x0D が抜けていたようです。
'\n'はLFなのか。。。ありがとうございました。
0727デフォルトの名無しさん
2009/05/04(月) 21:57:08・strcmpで比べるデータの比べる開始位置が違う、お尻にゴミが付いてる
・strcmpで比べる前になんで表示しないの?
・改行コードのは0x0Dだけでいいの?0x0D+0x0Aセットもあるよ。バイナリエディタで見てみるとテキストといえど違うよ
0728デフォルトの名無しさん
2009/05/04(月) 22:07:41ゴミが付いているという件ですが、どうやったら調べられるのかわかりません。
char* fgetarea(FILE* fp, fpos_t pos_set, fpos_t pos_end)で
p = malloc(len - 5);でも動いたので、文字列より多くmalloc()してるということでしょうか。
だとしたら何でかな。。。
表示については比べた後で表示してるのですが何がいけないのでしょうか。
改行は'\n'がLFならisAttributeが1になるので問題ないと思いました。
0729デフォルトの名無しさん
2009/05/04(月) 22:13:21まずはstrcmpが比べてる長さがprintfなどで視認できる文字数とあってるか確認
おかしいなら文字にしてくれる便利な関数を使わないで文字コードを起こしてみてみる
まあおかしくなる原因は文字として割り当てのない制御コードあたりが付いてるとかそんな程度だろうし
0730デフォルトの名無しさん
2009/05/04(月) 22:16:120731デフォルトの名無しさん
2009/05/04(月) 22:21:28例えばこういうことでしょうか?
void string_dump(char* string)
{
char* p = string;
while(*p != '\0') {
printf("%x ", *p);
p++;
}
printf("\n");
}
正しくないプログラムでやったら終端にd(CR)が来てわかりやすくなりました。
こういうやり方があったのですね。覚えておきます。
0732デフォルトの名無しさん
2009/05/04(月) 22:25:22printf系は当然文字の割り当てがない制御コード(改行コード)とかは表示できないけど
文字の操作系は0x00以外は文字として処理しそうな感じだから当然見えない文字が
あってstrcmpは長さの違う文字を比較してることになることになるケースもある
じゃあなんでそんな切り方をするか・・・と考えていけばバグの原因もわかるかと
0733デフォルトの名無しさん
2009/05/06(水) 00:27:371のキーが押された時(一回押されたら、その後もずっと)y01の動作を止めたいんですが、どうしても離したときにflagが1に戻ってしまいます
書き方が悪いのか、どうも処理に矛盾が出てしまう…。
int i;
int flag = 0;
timer++; //グローバルで0で初期化済み
if( timer >= 50 ) flag = 1;
if( CheckHitKey( KEY_INPUT_1 ) == 1 ) flag = 0; //1キーが押された時の処理
switch( flag ){
case 0:
break;
case 1:
for( i = 0 ; i < DOWN_SPEED ; i++ ){ //定数は5
y01++; //グローバルで50で初期化済み
}
break;
default:
break;
}
0734デフォルトの名無しさん
2009/05/06(水) 01:57:45とりあえずそのソースだけ見るとtimerが増える一方だと思うんだが
1キーが押された時とかにtimerを初期化しなくていいのか?
0735デフォルトの名無しさん
2009/05/06(水) 03:37:58そのコードは、ゲームループで毎フレーム実行されるんだろ?
"一回押されたら、その後もずっと" をするなら、グローバルか、static で結果を保持するしかないでしょ?
で整理すると、timer で50フレーム待って、それ以降はy01が毎フレームDOWN_SPEEDだけ増加すると
(お節介だが、マルチスレッドでy01を見てるとかじゃなければ y01 += DOWN_SPEED; じゃね?)
で、
>1のキーが押された時(一回押されたら、その後もずっと)y01の動作を止めたいんです
も、条件に入ると
static int flag_key = 0;
int i;
int flag = 0;
timer++; //グローバルで0で初期化済み
if( timer >= 50 ) flag = 1;
if( CheckHitKey( KEY_INPUT_1 ) == 1 ) flag_key = 1; //1キーが押された時の処理
if( flag == 1 && flag_key == 0 ) y01 += DOWN_SPEED;
こんな感じにエスパーして見たw
0736デフォルトの名無しさん
2009/05/06(水) 03:41:37int i;
は、もう要らないね
0737デフォルトの名無しさん
2009/05/06(水) 12:49:48あーstatic使わないとダメだったのかぁ。
前に>>735と同じ処理書いたけど、つかってなかったから動作しなかったみたい。
助かった、ありがとう。
0738デフォルトの名無しさん
2009/05/06(水) 13:54:24俺は全体の処理をしらないから static 使ったけど
ゲームの状態(再リセット等)での static 変数の再初期化とかもあるんじゃね?
普通に global 変数にして管理した方が良いよ
0739デフォルトの名無しさん
2009/05/06(水) 16:32:32http://www.amazon.co.jp/dp/4890524436
がおすすめなんですが、いかんせん 16bit の時代の書籍ですからねえ。
なにかこの手の本をもういちど出して欲しいですね。>きた先生
0740デフォルトの名無しさん
2009/05/06(水) 16:34:38windowsで16bitって・・・・・・
0741デフォルトの名無しさん
2009/05/06(水) 16:47:53いろいろ理不尽なお作法があって、32bit よりも大変でした。
0742デフォルトの名無しさん
2009/05/06(水) 16:50:05知ってる
x86の16bitモードは使いにくい
0743デフォルトの名無しさん
2009/05/06(水) 17:23:50Windowsは節約でミディアムモデルが多かったなあ
0744デフォルトの名無しさん
2009/05/06(水) 21:51:38それにどうあがいても64KBの壁はこえられない。EMSのページも64KB単位でデータ管理しなくちゃいけないし。
いい訓練にはなりましたが。
0745739
2009/05/06(水) 23:28:11そうそう, >>739 にしても C 言語の基本はマスターしておかないときついです。
適当な参考書で自習してくださいね。MS-DOS/コンソールアプリは自力で書ける/デバッグできるくらいの腕力は必要かと。
って 100 近くも昔のものにレスするのもどうですかね。
0746デフォルトの名無しさん
2009/05/06(水) 23:51:480747デフォルトの名無しさん
2009/05/06(水) 23:56:08たとえば、
int cmp(char *a, char *b) { return strcmp(a, b); }
qsort(base, n, sizeof(char *), (int (*)(void *, void *)cmp);
0748デフォルトの名無しさん
2009/05/07(木) 00:04:340749>>746
2009/05/07(木) 00:10:07ありがとうございます。
>>748
コールバックと関数ポインタのそれぞれ単独は使ったことがあるのでわかるんですが
それを両方一度にというのを今回やってみようと思ったのですが記述がよくわからなかったもので・・・・
ちなみに中はどのように処理すればいいんでしょうか?
0750>>746
2009/05/07(木) 00:19:54関数ポインタのポインタ->関数ポインタ->関数
となっててコールバック元へ関数ポインタのポインタを渡せばいいんでしょうけど
Cでの記述がわかりませんorz
0751>>746
2009/05/07(木) 00:20:53>Cでの記述がわかりませんorz
コールバックする側のCでの記述もよくわかりませんorz
0752>>746
2009/05/07(木) 00:30:39関数ポインターで配列の形を取ってるものをコールバックさせるでしたorz
たびたびすみません
0754デフォルトの名無しさん
2009/05/07(木) 00:32:05int (*)(char *, char *)をint (*)(void *, void *)にキャストすることはできない
0755>>746
2009/05/07(木) 00:39:09これでいいのかな?
0756747
2009/05/07(木) 00:39:43違います。qsort() の第4引数 int (*comp)(const void *, ocnst void *) にキャストしているのです。
使ってみればわかります。
0757デフォルトの名無しさん
2009/05/07(木) 00:50:420758デフォルトの名無しさん
2009/05/07(木) 01:05:37void callee() {}
void caller(void (*pf)(void)) { pf(); }
int main() { caller(callee); return 0; }
0760デフォルトの名無しさん
2009/05/07(木) 01:19:05>>747のような、「関数ポインタをキャストするようなやり方」はセンスが無い、とは言い切れる。
int cmp(const void *p1, const void *p2) { return strcmp((char *p1), (char *p2)); }
のような、データのキャストだけで済むようにする方が
読みやすいしバグが混入する可能性も減らせる。
0761デフォルトの名無しさん
2009/05/07(木) 01:20:390762デフォルトの名無しさん
2009/05/07(木) 01:23:03面白い
0763デフォルトの名無しさん
2009/05/07(木) 01:23:30タッチしないとは言ったものの、
関数ポインタをデータポインタにキャストすることは安全ではない。
void*へのキャストを含めて。
関数ポインタ同士でのキャストについては、知らないから何もコメントできない。
0764デフォルトの名無しさん
2009/05/07(木) 01:24:490765747
2009/05/07(木) 01:24:49まあ、今はマクロ(templete) で生成的に書くやりかたが普通ですし。
でも qsort() のような使い方は、ちょっと前まではごくあたりまえだったと思うですが。そのための void * でしたし。
0766デフォルトの名無しさん
2009/05/07(木) 01:26:15出典は規格票。キャストできるとはどこにも書いていない。
して良いと書かれていないキャストをした場合は未定義動作だから
コンパイルが通るなんてのは、なんの反論にもならない。
関数ポインタを別の関数ポインタにキャストすることはできないし、
関数ポインタを汎用ポインタにキャストすることもできない。
0767デフォルトの名無しさん
2009/05/07(木) 01:26:30それはそうですね。昔は (void (*)())0 と (void *)0 が違った世界もありました。コンパクトモデルとか。
0769デフォルトの名無しさん
2009/05/07(木) 01:28:57何がいけないのでしょうか?
#include <stdio.h>
#include <string.h>
int main() {
char * ch1 = "こんにちは";
char * ch2 = "タナカくん";
printf("ch1 = %s\n", ch1);
printf("ch2 = %s\n", ch2);
strcat(ch1, ch2);
printf("ch1+ch2 = %s\n", ch1);
}
0770デフォルトの名無しさん
2009/05/07(木) 01:32:360771デフォルトの名無しさん
2009/05/07(木) 01:33:10> char * ch1 = "こんにちは";
> char * ch2 = "タナカくん";
ここでconstが落ちてる。
const char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
と書きなさい。
0772デフォルトの名無しさん
2009/05/07(木) 01:34:570773769
2009/05/07(木) 01:38:26const char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
とするとコンパイル時警告となり
char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
とするとランタイムエラーのままです
0774デフォルトの名無しさん
2009/05/07(木) 01:41:460775769
2009/05/07(木) 01:48:05char * function(char *x, char *y) {//<-ココ}
char *z = function("こんにちは", "タナカくん");
0776デフォルトの名無しさん
2009/05/07(木) 02:22:33今日もよろしくお願いします。
長いため分割で乗せますので解説お願いします(今、関数でつまずいています)
/*今日も頑張るぞ!!*/
#include<stdio.h>
double tasizan(double x,double y);
double hikizan(double x,double y);
double kakezan(double x,double y);
double warizan(double x,double y);
int main(void){
double a,b;
scanf("%lf%lf",&a,&b);
printf("足算:%f\n",tasizan(a,b));
printf("引算:%f\n",hikizan(a,b));
printf("乗算:%f\n",kakezan(a,b));
printf("割算:%f\n",warizan(a,b));
0777続きです
2009/05/07(木) 02:23:16/*引数の足算*/
double tasizan(double x,double y){
double answer;
answer=x+y;
return answer;
}
/*引数の引算*/
double hikizan(double x,double y){
double answer;
answer=x-y;
return answer;
}
/*引数の乗算*/
double kakezan(double x,double y){
double answer;
answer=x*y;
return answer;
}
0778割算のため0は使えないという風にしてます
2009/05/07(木) 02:26:17double warizan(double x,double y){
double answer;
if(y==0){
printf(エラーです\n);
answer=0,0;
}else{
answer=x/y;
}
return answer;
}
0779デフォルトの名無しさん
2009/05/07(木) 02:31:280780デフォルトの名無しさん
2009/05/07(木) 02:42:16文字列を""で囲まないとどんなエラーなのかわからないから答えようがない
0781デフォルトの名無しさん
2009/05/07(木) 02:45:02ごめんなさい。
printf("エラーです\n");←の""のことですか?
0782("エラーです\n")に直した結果
2009/05/07(木) 02:49:54コンパイルしています...
sample.c
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(12) :
warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(20) : error C2143: 構文エラー : ';' が '型' の前にありません。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'answer' : 定義されていない識別子です。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'x' : 定義されていない識別子です。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'y' : 定義されていない識別子です。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(23) : error C2065: 'answer' : 定義されていない識別子です。
ビルドログは "file://c:\Documents and Settings\mieko\My Documents\Visual Studio 2008\Projects\マイクロソフト プログラム練習\Debug\BuildLog.htm" に保存されました。
プログラムはこっちを使って練習 - エラー 5、警告 1
↑何回見てもエラー部分のスペルや分法が間違っているようには見えないのですが・・・。
0783デフォルトの名無しさん
2009/05/07(木) 02:55:10その行かその直前の行を穴のあくほど見直せ。
とりあえずmain()の最後に}が抜けてるのはコピペミスかもしれんが。
0784デフォルトの名無しさん
2009/05/07(木) 02:55:26return 0;の後ろに{忘れてただけでした。
すみません。
0785デフォルトの名無しさん
2009/05/07(木) 02:57:04時間差で教えてくれててありがとうございました。
0786デフォルトの名無しさん
2009/05/07(木) 02:58:060787デフォルトの名無しさん
2009/05/07(木) 03:23:38まさか。だいたい、昔(K&R1) はこういうときには char * をつかっていましたよ。void * ができたのはその後のこと。
0788デフォルトの名無しさん
2009/05/07(木) 04:34:36{
char *p;
p=(char *)malloc(strlen(x)+strlen(y)+1);
strcpy(p,x);
strcat(p,y);
return p;
}
0789デフォルトの名無しさん
2009/05/07(木) 09:16:41ANSI準拠でない、という話をしているのに、なんでK&Rがでてくるんだ。
ANSI以前のK&Rには移植性のかけらもない。
0790デフォルトの名無しさん
2009/05/07(木) 11:48:510791>>746
2009/05/07(木) 11:49:36むしろ今となっては型があってないとまずいのはアライメントの問題とかでしょ
0792デフォルトの名無しさん
2009/05/07(木) 11:59:20void*からchar*に代入しようとすると、ポインタの(暗黙的)キャストが発生するが、
そのときに適切にポインタを変換してやればいい。
0793デフォルトの名無しさん
2009/05/07(木) 12:26:34型がちがうとサイズもちがうってことはありえるよ。
0794デフォルトの名無しさん
2009/05/07(木) 13:18:20たとえば?
0795デフォルトの名無しさん
2009/05/07(木) 13:31:28ANSI Cはそのような環境にも移植できるようになっている。
0796デフォルトの名無しさん
2009/05/07(木) 16:00:31ポインタ≒メモリアドレスという理解しか出来ないからわかんないや
0797デフォルトの名無しさん
2009/05/07(木) 18:04:01void read_data(char *filename, double x[], double y[], int *n){
FILE *fp = fopen(filename, "rt");
int i;
fscanf(fp,"%d",n);
for(i=0;i<*n;i++)
fscanf(fp, "%lf%lf", &x[i], %y[i]);
fclose(fp);
コンパイラによるとfscanfの部分にエラーがあるようですが
プリントと見比べて違っているところがわかりません。
どこがおかしいか、教えていただけないでしょうか?
0798デフォルトの名無しさん
2009/05/07(木) 18:05:12ここですね・・・見落としてました。自己解決です
すみません
0799デフォルトの名無しさん
2009/05/07(木) 20:03:12逆ではないかと。
void * -> char * は問題がなく(だから暗黙のキャストでOKなわけ)、むしろ char * -> void * で「本当にアラインメントを無視してもいいのか」という
警告が出ます。qsort() の第4引数では書き手がOKを明示するために、キャストが必要なわけです。
K&R の古からあたりまえに行われてきたことですから、ANSI標準でばっさり切られることはないと思うのですが。>>789
というかK&R1のソースはきょうびのコンパイラではもう全然コンパイルできないのですか?(若干の修正は要るにしても)
0800デフォルトの名無しさん
2009/05/07(木) 21:19:27レガシーコードがansiでコンパイルできないのは最早常識。
0801デフォルトの名無しさん
2009/05/07(木) 21:23:02> 9899:1999 6.3.2.3/8
> A pointer to a function of one type may be converted to a pointer to
> a function of another type and back again; the result shall compare
> equal to the original pointer. If a converted pointer is used to call
> a function whose type is not compatible with the pointed-to type,
> the behavior is undefined.
compatible type については分散してるので引用はパス。6.2.7 から辿ってくれ。
基本的には同じ型だと思っていいと思う。
>799
> 9899:1999 6.2.5/26
> A pointer to void shall have the same representation and alignment requirements as a
> pointer to a character type.
なので char* と void* のアラインメント要求、表現が同一であることは保証されている。
0802デフォルトの名無しさん
2009/05/07(木) 21:42:42K&Rからの名残だし今の規格でも認められてる。
関数ポインタのキャストをするのは危険。
>>800のいうとおり。
0803デフォルトの名無しさん
2009/05/07(木) 21:53:18古い遺物のようなソースを平気で書いちゃう
おじちゃんプログラマはもはやもう要らないってことか。
0804デフォルトの名無しさん
2009/05/07(木) 21:57:46でも、関数ポインタとかコールバックは適度に欲しい機能だから
付きまとう問題だと思うんだけどねえ
それにポインタサイズをころころ変えるコンパイラ?の方がまずい気がするんだが
そこまで詰めてどんだけメモリ節約する気なんだろとか思うわ
0805デフォルトの名無しさん
2009/05/07(木) 22:15:41関数ポインタをキャストするな、引数をキャストしろ、と皆言ってるんだろ。
0806デフォルトの名無しさん
2009/05/07(木) 22:24:51OSはubuntuをvm上で動かしています。シェルはbashで、gccでコンパイルしています。
ソースは以下です。K&R1-9の解答1そのまま(のはず)です(ただ質問内容は1-9の趣旨とは直接関係ない気も)。
#include <stdio.h>
#define NONBLANK 'a'
main()
{
int c, lastc;
lastc = NONBLANK;
while((c = getchar()) != EOF)
{
if (c != ' ')
putchar(c);
if (c == ' ')
if (lastc != ' ')
putchar(c);
lastc = c;
}
}
1.上記を実行し「hoge」+Enterと打ち込むと次の行に「hoge」と出力されます。
これはEnterで標準入力が終わり、かつ一文字として出力されるので改行される、という認識であってますか?
2.何も入力せずにCtrl+Dだけ打ち込むとプログラムが終わります。
しかし「hoge」+(Ctrl+D)と打ち込むと、改行なしに「hoge」と出力されるだけでプログラムが終わりません。
なぜ終わらないのでしょうか?
よろしくお願いします。
0807デフォルトの名無しさん
2009/05/07(木) 22:26:39好き勝手に(いかにクソにでも)して良いってのが
絶対的建前。
よって多くのコンパイラではこうだからうんぬんなんてのは役立たん。
0808デフォルトの名無しさん
2009/05/07(木) 22:34:451.OK
2.while((c = getchar()) != EOF)のgetcharが入力を待っているから。
EOFが返されていない。
0809デフォルトの名無しさん
2009/05/07(木) 22:39:55mod = LoadStartModule("lflash_fatfmt.prx");
if (mod < 0)
{
ErrorExit(6000, "Error %08X loading/starting lflash_fatfmt.prx\n", mod);
}
mod = LoadStartModule("ipl_update.prx");
if (mod < 0)
{
ErrorExit(6000, "Error %08X loading/starting ipl_update.prx\n", mod);
}
mod = LoadStartModule("libpsardumper.prx");
if (mod < 0)
{
ErrorExit(6000, "Error %08X loading/starting libpsardumper.prx.\n", mod);
}
}
何とかしてください。お願いします。
0810デフォルトの名無しさん
2009/05/07(木) 22:41:10http://schiphol.2ch.net/test/read.cgi/gameurawaza/1231340677/
0811デフォルトの名無しさん
2009/05/07(木) 22:45:530812806
2009/05/07(木) 23:09:30>>808
通常だとgetchar() でまず入力を待ち、
Enterで入力が終わったらループが一文字ずつ回り、
文字列がなくなるとまたgetchar() で入力待ちになるわけですよね?
しかし「hoge」+(Ctrl+D)を打ち込むと
ループの最後の一文字がEOFになるからプログラムが終了するかと思ったんですが。
>EOFが返されていない
というのは、EOFが標準入力の終わりになったときは、Enterとは違ってそのまま消えてしまうということでしょうか?
見当違いでしたらすみません。
0813デフォルトの名無しさん
2009/05/07(木) 23:35:59>行バッファが空の場合は、0文字が送信され、これがEOFと解釈される。
>だから行の途中でCtrl-Dを入力してもEOFとは解釈されない。
0815デフォルトの名無しさん
2009/05/07(木) 23:46:30何分初心者なので見にくいかもしれませんが、お願いします
#include<stdio.h>
int main()
{
int m, i, j;
int ma[i][j];
printf("m = "); scanf("%d", &m);
for(i = 0; i < m; i++){
for(j = 0; j < m; j++)
if(i = j)
ma[i][j] = 1;
else
ma[i][j] = 0;
}
for(i = 0; i < m; i++){
for(j = 0; j < m; j++)
printf("%d", ma[i][j]);
putchar('\n');
}
return 0;
}
0816デフォルトの名無しさん
2009/05/07(木) 23:50:38___^^
コンパイルエラー:残念ながら配列の大きさを変数で間接的に指示することは
出来ません。
コンパイルエラー:i , j は未初期化なので不定な値が入っています。
他の変数の初期化等に利用することは出来ません。
0817デフォルトの名無しさん
2009/05/07(木) 23:54:50このエラーを100回読め。
はっきり書いてあるじゃん!
0818デフォルトの名無しさん
2009/05/07(木) 23:57:46__^^
コンパイルエラー:32ビット処理系ではシフト演算子の上限は32まで
です。
このエラーを100回読め。
^^
コンパイルエラー:残念ながら現状のC処理系では日本語は使えません。
はっきり書いてあるじゃん!
^^
コンパイルエラー:残念ながら現状のC処理系では日本語は使えません。
0819デフォルトの名無しさん
2009/05/08(金) 00:12:32コンパイルでエラーはでてませんでした
0820デフォルトの名無しさん
2009/05/08(金) 00:15:010821デフォルトの名無しさん
2009/05/08(金) 00:22:14C99対応のコンパイラを使っていて、
エラーにならなかったという可能性もあるね。
たしかに、それでも結局だめなことに変わりはないけど。
0822デフォルトの名無しさん
2009/05/08(金) 01:57:14>int ma[i][j];
なんのつもりでこう宣言したのか説明してくれ
0823デフォルトの名無しさん
2009/05/08(金) 08:27:26unsigned char api_id;
unsigned short saddr16 __attribute__((packed));
unsigned char rssi;
unsigned char option;
}header __attribute__((packed));
gccです。
header構造体のメンバをアラインメントを無視して配置したいのですが
なぜか3行目のpackedを追加しないとsaddr16がワード境界に配置されてしまいます。
本来3行目のpackedってっていらないはずですよね?
0824デフォルトの名無しさん
2009/05/08(金) 08:33:09gccというかCPUはなんでしょ
unsigned char api_id;
この段階ですでにアライメント調整が発生して
unsigned char api_id;
ここに調整用の1バイト
unsigned short saddr16
となるのは容易に想像が・・・
0825デフォルトの名無しさん
2009/05/08(金) 09:12:50CPUはPIC24Fです。16bitです。
6行目のpackedで構造体メンバまとめてアラインメント無視…というわけでは
ないんでしょうか?
0826デフォルトの名無しさん
2009/05/08(金) 09:17:490827デフォルトの名無しさん
2009/05/08(金) 09:17:57構造体にかかってるpackedは構造体全体が奇数バイトであろうが偶数バイトであろうが
アライメント無視して詰めるってことかと
直接関係してくるのは構造体を配列として利用した際の2個目から?
0828デフォルトの名無しさん
2009/05/08(金) 09:35:59なるほど、そういうことですか。
納得出来ました、ありがとうございます。
0829デフォルトの名無しさん
2009/05/08(金) 09:55:57>826
#pragma pack(1)
0830デフォルトの名無しさん
2009/05/08(金) 10:00:17どかっと増えそうだけど大丈夫?
0831デフォルトの名無しさん
2009/05/08(金) 10:03:170832デフォルトの名無しさん
2009/05/08(金) 10:26:22struct pkt{
unsigned char msb;
unsigned char lsb;
union{
char api_structure[128];
〜〜略〜〜
struct{
struct{
unsigned char api_id;
unsigned short saddr16 __attribute__((packed)); // big endian!!
unsigned char rssi;
unsigned char option;
}header;
char data[100];
} type_rx16;
};
};
こんな感じです。略の部分に他にもいくつかの構造体が並んでいます。
もっといい方法があるのかも知れないです。
C言語は昔取った杵柄で書いてるので、おかしな事をしてるかも知れません。
0833デフォルトの名無しさん
2009/05/08(金) 10:53:14#define MY_SIZE ( sizeof(struct mine) )
#define MY_LEN ( MY_SIZE * 512 )
int main()
{
...
read(fd, buf, MY_LEN);
...
n += MY_SIZE;
...
}
「#define MY_SIZE sizeof(struct mine)」や「#define MY_LEN MY_SIZE * 512」
として()を抜いても結果は変わらなかったのだけど、どうなのだろう。
gcc-4.3.2でコンパイルしています。
0834デフォルトの名無しさん
2009/05/08(金) 10:56:19#define MY_LEN ( MY_SIZE * 512 )
ではなく
たとえば
#define MY_LEN MY_SIZE + 512
だった場合
read(fd, buf, MY_LEN*2);
だったりすると
read(fd, buf, MY_SIZE + 512*2);
と置かれる
こういうのを回避するために
#define MY_LEN (MY_SIZE + 512)
としておけば
read(fd, buf, (MY_SIZE + 512)*2);
という置換が行われる
0836デフォルトの名無しさん
2009/05/08(金) 21:04:15char *namae;
int tokuten[3];
};
int main(void)
{
struct test math[5] = {
の様に続けて↑の構造体配列のメンバの配列に初期値を設定するには
どうすればいいんでしょうか?
0837デフォルトの名無しさん
2009/05/08(金) 21:07:42こんな感じ
0838デフォルトの名無しさん
2009/05/08(金) 21:08:29struct test math[5] = { { NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0} };
0839デフォルトの名無しさん
2009/05/08(金) 21:16:39ありがとうございます
{}はいらないんですね
0840デフォルトの名無しさん
2009/05/08(金) 23:52:13月が3か4で、月が3の場合は日が21以上30以下、月が4の場合は1以上19以下でおひつじ座と表示したい時
条件を設定する時の複合条件の書き方がわかりません
a=3 && b>=21 || b<=31
elseはエラーの表示
a=4 && b>=1 || b<=19という感じに何個もif文を書き繋げていくしかないのでしょうか?
#include<stdio.h>
void main(void)
{
int a,b;
printf("月入力---->");
scanf("%d",&a);
printf("日入力---->");
scanf("%d",&b);
if( ( a > 13 ) || ( a == 0 ) )
{
printf("Input error!");
}
if(?)
{
printf("?");
}
}
0841デフォルトの名無しさん
2009/05/08(金) 23:57:570842デフォルトの名無しさん
2009/05/09(土) 00:02:06繋げていくしかないね
if( (a==3 && (21<=b && b<=31)) || (a==4 && (1<=b && 19<=b)) )
0844デフォルトの名無しさん
2009/05/09(土) 00:27:47日付を単純に数字(例えば1月1日を1として1-365)に変換して
それを数字から星座への変換するように作る手もある。
0845デフォルトの名無しさん
2009/05/09(土) 00:29:440846839
2009/05/09(土) 00:36:27その発想は無かったです、目から鱗でした
その場合はscanfで入力した月と日が1月1日から何日目なのかを計算するのに頭を悩ませそうですorz
でも参考になりました
0847デフォルトの名無しさん
2009/05/09(土) 00:57:43各月の日付にいくつ足すかを持てばよい。
別に365じゃなくて、12x32とかの数字に変換しても良いだろ。1方向変換なんだから。
配列をまだ習ってなかったらごめんな。
0848デフォルトの名無しさん
2009/05/09(土) 03:14:12環境変数を設定するputenvがコンパイラにより挙動が違って困っています。
あるフリーのDLLが環境変数でパラメータを渡さなければならないのでputenvを使って渡しているのですが、
MSVC++でコンパイルした実行ファイルではDLLに環境変数が渡らず、
mingwでコンパイルした実行ファイルではDLLに環境変数が渡せます。
(ただ開発はMSVC++で行いたいので、mingwでできても意味がありません)
ご存知の方がいらっしゃればよろしくお願いいたします。
※ちなみにSetEnviromentVariableを使うとどっちのコンパイラでも環境変数がDLLにわたりませんでした。。。
0849デフォルトの名無しさん
2009/05/09(土) 03:20:41も少し具体的に書いたほうがいい
DLL名称やどんな環境変数を渡すのか
DLLに環境変数が渡らなかったということをどう確認したのか
とか...
0850デフォルトの名無しさん
2009/05/09(土) 03:23:06通日を求める式を作ってみた
leapはうるう年なら1、その他は0
m*30 + m/2 + (m<=2 ? 2 : !(~m&9) + leap) + d - 32;
0851デフォルトの名無しさん
2009/05/09(土) 03:28:18CreateProcess を呼ぶだけの実行ファイルを作成して
CreateProcess で第7引数を指定するとか
0852デフォルトの名無しさん
2009/05/09(土) 03:33:20そもそも month*100+mday なら換算が楽だ
x=month*100+mday;
if(x<=119) yagi
else if(x<=218) mizugame
...
else if(x<=1231) yagi
0853デフォルトの名無しさん
2009/05/09(土) 03:43:15星座は均等に割り振ってるんだと思ったから通日が分かれば÷12でswitch出来るかと思ったんだけど
なんか均等じゃない上占いごとに微妙に違うのな
0854デフォルトの名無しさん
2009/05/09(土) 04:46:57int start_mon, start_day;
int end_mon, end_day;
char *name;
int start_cday, end_cday;
};
というような構造体の配列を作ってだな、
プログラムには最初と最後の日付で記録しておく。
で、先頭でループしてstart_cdayとend_cdayを計算する。
入力したら、(日付のエラーチェック後)
同様にループで回して、通年の日番号でどこに含まれるかチェックする。
と思ったが、この程度で済むなら
通年に直さなくても見通し悪くはならないかもな。
0855デフォルトの名無しさん
2009/05/09(土) 05:31:00もう終わってる話に何だけど
struct test math[5] = {{0}};
これじゃあかんかったっけ?
C99なら
struct test math[5] = {};
でも良かった気がする。
デマカセだったらすまね。
0856デフォルトの名無しさん
2009/05/09(土) 07:18:44■ ■■■■■ ■ ■■■■■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■
■■■■■■■■■■■■■■■
0857デフォルトの名無しさん
2009/05/09(土) 11:41:56失礼しました。dllは漢字→かな変換のkakasiです。
辞書ファイルへのパスを環境変数として設定する必要があるためにputenvしてます。
そのままソースコードをのせます。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void main(void){
HMODULE hKakasiDLL = LoadLibrary(".\\kakasi\\kakasi.dll");
int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );;
char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" );
int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" );
putenv( "ITAIJIDICTPATH=.\\kakasi\\itaijidict"); // 辞書ファイルへのパスを環境変数に設定
putenv( "KANWADICTPATH=.\\kakasi\\kanwadict"); // 辞書ファイルへのパスを環境変数に設定
char* argv[] = {"kakasi", "-JH","-kH"};
kakasi_getopt_argv(3,argv);
char* hiragana = kakasi_do("漢字カタカナをひらがなに変換しますん");
printf("%s\n", hiragana);
kakasi_free(hiragana);
FreeLibrary(hKakasiDLL);
}
上記ソースをmingwでコンパイルして実行すると以下の結果に。
→かんじかたかなをひらがなにへんかんしますん
MSVC++6.0でコンパイルして実行すると以下の結果になってしまいます。
→c:/kakasi/share/kakasi/kanwadict: No such file or directory
c:/kakasi/share/kakasi/kanwadictは環境変数を設定しない場合のデフォルト検索位置です。
※それ以前にMSVC++6.0使ってるのが悪い?
0859デフォルトの名無しさん
2009/05/09(土) 12:05:09もし誤差による場合、それはどうすれば改善できますか?
どなたか教えてください。
#include <stdio.h>
main() {
int n;
double p;
p = 2.0;
for( n=1; n<=10000; n++ ) {
if(n%2!=0){p=(p*(n+1)*(n+1))/(n*(n+2));}
if( n%1000==0 ) { printf("%8d %le \n",n,p); }
}
printf("\n");
}
0860857
2009/05/09(土) 12:06:15>>851の方法も試してみましたが、mingwでもMSVC++でも環境変数を認識してくれませんでした。。。
以下は試したコードです。
#include <stdio.h>
#include <windows.h>
void main(int argc, char* argv[]){
PROCESS_INFORMATION pi;
STARTUPINFO si;ZeroMemory(&si,sizeof(si));si.cb=sizeof(si);
char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0\0KANWADICTPATH=.\\kakasi\\kanwadict";
CreateProcess(argv[1],NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,env,NULL,&si,&pi);
}
上記を実行してみたところこれでした→c:/kakasi/share/kakasi/kanwadict: No such file or directory
長々と申し訳ないです。もうちょっと調べてみます。
0861デフォルトの名無しさん
2009/05/09(土) 12:22:08\0 を二回重ねる位置が違う
char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0\0KANWADICTPATH=.\\kakasi\\kanwadict";
↓
char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0KANWADICTPATH=.\\kakasi\\kanwadict\0\0";
※最後に \0 が1つ余分になるけど明示するためにあえて二つ書く!
0862デフォルトの名無しさん
2009/05/09(土) 12:26:49LoadLibrary より先に環境変数を設定すればいけそうな気がするが、
コンパイラによって挙動が変わるのは納得いかないな
0863デフォルトの名無しさん
2009/05/09(土) 12:27:31とりあえず君の実行環境は?
0864デフォルトの名無しさん
2009/05/09(土) 12:31:41UNIXのTera Term VTです。
0865デフォルトの名無しさん
2009/05/09(土) 12:39:26実行結果はどうなる?全然違う値になる?それとも3.14にそこそこ近いの?
0866デフォルトの名無しさん
2009/05/09(土) 12:43:181000 3.140808e+00
2000 3.141200e+00
3000 3.141331e+00
4000 3.141396e+00
5000 3.141436e+00
6000 3.141462e+00
7000 3.141480e+00
8000 3.141494e+00
9000 3.141505e+00
10000 3.141514e+00
実行結果
1000 3.140024e+00
2000 3.140808e+00
3000 3.141069e+00
4000 3.141200e+00
5000 3.141279e+00
6000 3.141331e+00
7000 3.141368e+00
8000 3.141396e+00
9000 3.141418e+00
10000 3.141436e+00
となってしまいます。
0867デフォルトの名無しさん
2009/05/09(土) 12:49:23doubleの誤差の前に、もしかしてアルゴリズムが模範解答と違うんじゃない?
模範解答のnが君の2nに当たっているように思えるが。
0868デフォルトの名無しさん
2009/05/09(土) 12:52:29すいません、気づきませんでした。
でも、その場合どう改善すればいいんですか??
0869867
2009/05/09(土) 12:54:25>>866
そんなに聞いてどうするw俺はプログラミングは仕事じゃなくてただの趣味人間なのに。
まあね、おそらくカウンタは君と同じく
for( n=1; n<=10000; n++ )
なんだろうが、適用するところで
p=(p*(2n+1)*(2n+1))/(2n*(2n+2));
としているのだろう。これならifの条件分岐すら要らない。
0870デフォルトの名無しさん
2009/05/09(土) 13:01:12聞いてばっかりでごめんなさい。
ありがとうございました。
0871デフォルトの名無しさん
2009/05/09(土) 13:02:05有名な計算はぐぐればあちこちに転がってるよ
0872867
2009/05/09(土) 13:02:09n++より++nの方が望ましい。
また、p*=(2n+1)*(2n+1)/(2n*(2n+2))と書くことも出来るだろう。
0874デフォルトの名無しさん
2009/05/09(土) 14:58:21右辺をどっかでdoubleにしないと
0876デフォルトの名無しさん
2009/05/09(土) 17:07:43プロローグ処理及びエピローグ処理を自前でって言われても、あまりピンとこないです
しかし、その処理を自前にすることにが、頻繁に呼ばれる関数等の速度向上のポイントではないか、と考えたのですが、
具体例とともにご教授ください
0877デフォルトの名無しさん
2009/05/09(土) 17:14:13ようするに何から何まで全部インラインアセンブラでやるから
コンパイラは何もするなというときに使う。
0878デフォルトの名無しさん
2009/05/09(土) 17:20:26えー、高速化という意味でピンときません
�@プロローグ及びエピローグ処理が抑制される
何故抑制出来る仕様になっているのですか?
0879デフォルトの名無しさん
2009/05/09(土) 17:30:000880デフォルトの名無しさん
2009/05/09(土) 17:31:29>>877が書いてくれてるインラインアセンブラを理解した方がいいかも
Cソースだけど、中身はインラインアセンブラを使ったアセンブラソースですよ
というのを教えるためなので高速化はインラインアセンブラの記述次第かと
0881デフォルトの名無しさん
2009/05/09(土) 17:49:42引数をスタックで渡すかレジスタで渡すかをプログラマが決めれる
よって高速化も可能ということもありますか?
0882デフォルトの名無しさん
2009/05/09(土) 17:51:25まあそうなりますね
そこまでして高速化したいってのがよくわからないけど
コンパイルオプションで最適化度合いを上げてみるとかもやってみました?
0883デフォルトの名無しさん
2009/05/09(土) 18:10:44まだです。
今からやってみます。
0884デフォルトの名無しさん
2009/05/10(日) 03:54:38割り込みベクタに設定するとか。
0885デフォルトの名無しさん
2009/05/10(日) 08:00:40方法ってどんな方法がありますか?
0886デフォルトの名無しさん
2009/05/10(日) 08:05:26順に舐める以外に思い付かん。
0887デフォルトの名無しさん
2009/05/10(日) 08:15:560888デフォルトの名無しさん
2009/05/10(日) 12:52:12全部なめるしかないだろうね
工夫するとすると、複数コア環境なら並列化して分割統治できるかもしれない、
doubleで演算すると遅いので整数レジスタで比較する、ぐらいかなあ
0889デフォルトの名無しさん
2009/05/10(日) 12:59:540890デフォルトの名無しさん
2009/05/10(日) 13:09:020891デフォルトの名無しさん
2009/05/10(日) 13:11:210892デフォルトの名無しさん
2009/05/10(日) 15:02:000893857
2009/05/10(日) 15:17:51全俺が泣いた。ご指摘のとおりです。
>>862
それもおもって環境変数設定する位置をずらしたりしましたがダメでした。
最終的にはkakasi.dllをバイナリエディタで開いて、
c:/kakasi/share/kakasi/kanwadictの部分を編集してパスを変えました^q^
色々勉強になりました。ありがとうございました。
0894デフォルトの名無しさん
2009/05/10(日) 19:35:45OSソラリス コンパイラgcc C言語
台形の面積を求めるプログラム
キーボードより上底a下底b高さhの値を入力して台形の面積を計算するプログラムを作成せよ。お願いします。
0895デフォルトの名無しさん
2009/05/10(日) 19:36:550896デフォルトの名無しさん
2009/05/10(日) 19:56:23なんでそれを認めないでスレがないとか言っちゃうんだろうな。
0897デフォルトの名無しさん
2009/05/10(日) 19:57:28> すいません。宿題スレないんでこちらで失礼します。
あんたバカぁ?
釣りは自重してください。
0898デフォルトの名無しさん
2009/05/10(日) 20:01:43坊やだからさ
0899デフォルトの名無しさん
2009/05/11(月) 16:29:350900デフォルトの名無しさん
2009/05/11(月) 16:32:29教師がへぼすぎだからだろ
宿題スレの課題のアホくささみてるとなあ
もうちょっと将来的に役にたちそうな数学系を学ばせればいいのにと思うよ。
ゲーム系で言えばベクトル系だとか物理演算などなど
0901デフォルトの名無しさん
2009/05/11(月) 16:35:01算数から持ってくりゃ計算部分の説明しないで済むしな
0902デフォルトの名無しさん
2009/05/11(月) 16:40:56標準の入出力なんてのもゴミだよな
一瞬で終わらせる内容で課題にするレベルでもなんでもないw
0903デフォルトの名無しさん
2009/05/11(月) 16:49:29でもそれをわざわざ聞きにくるってことはそもそも教えてないのかな?
いきなりやってみろと。
0904デフォルトの名無しさん
2009/05/11(月) 16:51:24だろうな
それで教師が納得してるというか、楽してるんだよ
プログラム組もうとしたら環境依存のAPI叩かないとまともな演出もできないのに
さっさとそっち教えた方がよっぽど現実で使える。
というかそれでさえ最低限の能力としてしか評価されないというのに。
0905デフォルトの名無しさん
2009/05/11(月) 16:53:420906デフォルトの名無しさん
2009/05/11(月) 16:58:32だねえ
あともっとベクトルの違う勘違いしてるのがbmpのヘッダー解析とか
それは車輪の再開発ですってのも結構あるな。
組み込みでもそんなの要求されるのか?というレベル
0907デフォルトの名無しさん
2009/05/11(月) 17:02:39組込だったらあるだろうね。
リンクリストやソートすら、いちから実装することがままある。
0908デフォルトの名無しさん
2009/05/11(月) 17:02:46給料が微妙そうだけどこーゆー簡単な仕事やりたいわ
0909デフォルトの名無しさん
2009/05/11(月) 17:06:13でもビットマップがサポートしてる全フォーマットを読み込めるような汎用ライブラリはいらんでしょ
0910デフォルトの名無しさん
2009/05/11(月) 17:31:54プログラムに意味があるもん。
文法を理解してるかどうかをチェックするためだけの
まったく意味のない課題とかよくあるよ。
0911デフォルトの名無しさん
2009/05/11(月) 17:35:52ようなこと、例えば代入や条件判定やループや標準入出力あたりの簡単な
ことでも、理解して使えるようになるまでに発想の飛躍が必要になる人も
いるのだよ。理解してしまえばそれこそ本人にとっては「一瞬」じゃんって
ことになるんだけどね。
数学科出身で、なぜか初めての言語がHaskellという人がいて、なかなか
優秀な人なんだけどCの代入文の理解で最初苦しんでいたな。
0912デフォルトの名無しさん
2009/05/11(月) 17:41:44初心者でもできるレベルで、独創的な課題なんてそんなんあるか。
0913デフォルトの名無しさん
2009/05/11(月) 17:46:59単品でだして課題を気取る程度じゃないってことでしょ
上で出てるbmpの処理なんてそれこそグラフィックのついでにさらっとやっておけばいいし
台形とかもグラフィックのついででいいのにそっちがメインになってるし
0914デフォルトの名無しさん
2009/05/11(月) 18:49:10自分の体重を入力すると月での実効体重を
計算し、表示するプログラムを作成してくだ
さい。
これ誰か組んでください↑
まったこ分りません
0915デフォルトの名無しさん
2009/05/11(月) 18:49:58宿題スレへどうぞ
その前にスレを探すスキルを身につけたほうがいいかも
なければ立つまで待て
0916デフォルトの名無しさん
2009/05/11(月) 18:51:390917デフォルトの名無しさん
2009/05/11(月) 19:10:56ttp://pc12.2ch.net/test/read.cgi/tech/1240022781/902
マルチかよ。なんだお前。
0918デフォルトの名無しさん
2009/05/11(月) 20:55:24そもそもミドルウェアとはなんですか?
初歩的な質問すいません
0919デフォルトの名無しさん
2009/05/11(月) 20:57:530920デフォルトの名無しさん
2009/05/11(月) 21:01:12コンパイラは翻訳機とでも言っておきましょう
C言語などは人間にまだわかりやすい言語
コンピューターはCPUごとに処理しやすい機械語(マシン語)というのが存在します。
これに翻訳するのがコンパイラです。
ミドルウェアというのはソフトウェアの一種です。
特定の機能をまとめた物で、ミドルウェアを使うことでわざわざ開発する手間を省くことができます。
特定の機能というのは、たとえば業務用のプログラムを組む場合はデータ管理をするプログラムは
DB機能を提供してるプログラムを使うことで開発する必要がなくなります。
ゲームでも最近はミドルウェアのお世話になることが多々あるようです。
まあ、どんなプログラムにせよある程度の部分は共通性がでてくるんですよね。
それを纏め上げて開発のサポートをするための物がミドルウェアです。
0921デフォルトの名無しさん
2009/05/11(月) 21:07:40レスどうもです。
ということはライブラリ等はミドルウェアに含まれるんですね。
とんちんかんな事言っているようでしたら容赦なく叩いてください。
0922デフォルトの名無しさん
2009/05/11(月) 21:09:54うーんライブラリ全般がミドルウェアというわけではないですね。
ミドルウェアといいえばOSよりは小規模ですがそれに近い存在の大きさの物
のことがほとんどですね。
0923デフォルトの名無しさん
2009/05/12(火) 00:15:090924デフォルトの名無しさん
2009/05/12(火) 00:25:170925デフォルトの名無しさん
2009/05/12(火) 00:29:01確かにエスパーだなw
>>923
配列を受け取る関数は自前で作成したものかすでに誰かが用意したものかでも違うし
他人が用意したものなら、その人と相談するしかないんじゃない?
自分で用意した物であればたとえばだけど、引数に配列の先頭アドレスと渡した配列は何個あるか
という数字を渡すようにするとかしかないと思う。
あと構造体で囲った場合は可変させる場合はどうするのとかあるよね
0926デフォルトの名無しさん
2009/05/12(火) 00:58:50みたいな感じで[5]以外の配列は受け取れない、みたいにしたいんです
上のやりかただとうまくいかないのでどうしたらいいのかなと
構造体ならいいんですけど数が増えてくるとうっとおしくて・・・
0927デフォルトの名無しさん
2009/05/12(火) 01:00:43cじゃあ無理じゃないかな
というかC#とかで開発してた口?
そういう面度は自分でみるしかないのがC
0928デフォルトの名無しさん
2009/05/12(火) 01:07:200929デフォルトの名無しさん
2009/05/12(火) 01:08:24そうじゃないだろ
渡す配列数は常に可変
でもそれを関数側に対応させたい
どう考えてもCじゃ無理です
0930デフォルトの名無しさん
2009/05/12(火) 01:09:04もとい
どう考えてもCじゃ配列の最大数を渡すとかしないと無理です
0931デフォルトの名無しさん
2009/05/12(火) 01:14:34>>926を読んでもそう思うならやべーなw
0932デフォルトの名無しさん
2009/05/12(火) 01:16:25へ?
上からの質問を見ると
質問者の本当の欲しいのはhoge hg[]でしょ
で関数内部では0〜4だけを処理させたい
0933デフォルトの名無しさん
2009/05/12(火) 01:22:34hoge hg[10]という配列になってて
そのある一定の範囲を処理させたいの?それもと
常に配列のどれか一つを処理させたいの?
0934デフォルトの名無しさん
2009/05/12(火) 01:24:49って言ってんだからhg[10]は関数に渡せないようにしたいんだろ。
0935デフォルトの名無しさん
2009/05/12(火) 01:27:260936デフォルトの名無しさん
2009/05/12(火) 01:34:590937デフォルトの名無しさん
2009/05/12(火) 01:36:56は?
両方あるならどっちが求める解か聞いて結論出すのが普通だろ
0938デフォルトの名無しさん
2009/05/12(火) 01:39:00要素数5(越えても未満でもだめ)であることを強制させたい。
構造体を作るほかに方法はないか?ということだな。
うん、確実なのはそれしかないと思う。
0939デフォルトの名無しさん
2009/05/12(火) 01:44:410940デフォルトの名無しさん
2009/05/12(火) 01:44:50hoge 1個を処理させる関数があってその関数を呼ぶ側がたまたまhogeを配列で確保しててる場合は
foo bar(hoge* ptr)
{
}
とでも関数をしておいて
hoge hg[10]
処理
bar(&hg[5]);
とすればhg[5]の先頭がわたる
でもCの場合hg[6]だろうがアドレスを足せば実は見えるわけで制限というのは
実はできないに等しい
自分変なアクセスをしないつくりにしないと
0941デフォルトの名無しさん
2009/05/12(火) 01:46:20お前が勘違いしすぎw
0942デフォルトの名無しさん
2009/05/12(火) 01:46:50比較もなにもCの場合は不正な場所にアクセスして停止するとかでなけえば
見える範囲はどこまでいけるよw
そんな安全機構は無い
0943デフォルトの名無しさん
2009/05/12(火) 01:52:540944デフォルトの名無しさん
2009/05/12(火) 01:54:13誰もそんな話しはしてない。
関数に渡す配列のサイズを限定したいなら、関数にサイズも一緒に渡して
関数内部で渡したサイズと求めるサイズを比較して違ったらエラーを返したらどうか
って言ってんの。
0945デフォルトの名無しさん
2009/05/12(火) 01:55:30呼び出す側で気をつけるか
構造体にするかのどちらかだね
0946デフォルトの名無しさん
2009/05/12(火) 03:27:320947デフォルトの名無しさん
2009/05/12(火) 04:20:50"abcde"[3]
とやると "d" を取得できますが、これと同じことを数列でもできますか?
0948デフォルトの名無しさん
2009/05/12(火) 04:28:130949デフォルトの名無しさん
2009/05/12(火) 04:29:180950デフォルトの名無しさん
2009/05/12(火) 04:42:50#include <stdio.h>
int main(int argc, char *argv[]){
printf("%d\n", (int []){1,2,3,4,5}[4]);
printf("%f\n", (double []){1,2,3,4,5}[2]);
return 0;
}
0951デフォルトの名無しさん
2009/05/12(火) 04:53:38ありがとうございます!
どのようなキーワードで検索したらよいのか分からないほど初心者ゆえ
拙い説明になってしまいましたが
思い通りの回答をいただき、感謝に尽きます
0952デフォルトの名無しさん
2009/05/12(火) 05:17:35アホな事書くなヴォケ
0953デフォルトの名無しさん
2009/05/12(火) 08:00:03>>950 はCの文法通りなんだけど。
0954デフォルトの名無しさん
2009/05/12(火) 08:08:57これなに?C99?独自拡張?
俺が無知なだけ?
0955デフォルトの名無しさん
2009/05/12(火) 08:23:260956デフォルトの名無しさん
2009/05/12(火) 08:26:15gccではコンパイルできたけどVC++ではエラーになった
0957デフォルトの名無しさん
2009/05/12(火) 09:34:06VCはC99に未対応。
0958デフォルトの名無しさん
2009/05/12(火) 10:11:55つ[複合リテラル]
0959デフォルトの名無しさん
2009/05/12(火) 10:29:59何いい加減な事言ってるんだ
K&R本のどこにもこんな書き方は認められていないぞ
認められているのはISO/IEC 9899:1999のみだ
C89はアウト
0960デフォルトの名無しさん
2009/05/12(火) 10:31:04ああコンパウンド・リテラルね
まんまC99からしか使えない
0961955
2009/05/12(火) 10:45:25あれ… さっきのファイルをもう一回 -ansi -pedantic でコンパイルしたら警告がでた。
a.c:4: warning: ISO C90 forbids compound literals
さっき何で平気だったんだろうと思ってシェルの履歴を見たら -peduntic になってたよ。
gccが何も言ってこないから気づかなかった。
0962デフォルトの名無しさん
2009/05/12(火) 11:24:44Cってこんな書き方出来るんだ。
ってかこれって初心者が覚える書き方じゃないだろw
0963デフォルトの名無しさん
2009/05/12(火) 12:05:40覚えておいて損はないと思う。
0964デフォルトの名無しさん
2009/05/12(火) 12:23:45while( enemy > 3 ){
srand ( ( unsigned) time ( NULL ) );
enemy = rand() % 10;
}
乱数を使って0〜2の数値をenemyに格納する時って、こういう書き方が普通なの?
もっと良い書き方あれば教えて欲しい
0965デフォルトの名無しさん
2009/05/12(火) 12:26:36同じ値でsrand呼ぶとrandが返す値は同じだぞ
0966デフォルトの名無しさん
2009/05/12(火) 12:27:500967デフォルトの名無しさん
2009/05/12(火) 12:32:34あ、そっかw
3で割れば余りは0〜2だもんな。
ゴメン、ボケてた
0968デフォルトの名無しさん
2009/05/12(火) 12:39:03もしくは
enemy = rand() / (RAND_MAX + 1.0) * 3;
0969デフォルトの名無しさん
2009/05/12(火) 12:49:210970デフォルトの名無しさん
2009/05/12(火) 13:02:440971デフォルトの名無しさん
2009/05/12(火) 13:05:44その場その場で考えて行けばいいだけで
それとも頭悪いの?
0972デフォルトの名無しさん
2009/05/12(火) 13:08:45struct x {
char a[10];
}
とか
struct x {
int a;
int b;
int c[];
}
こういうのか。
0973デフォルトの名無しさん
2009/05/12(火) 13:15:18int main(void)
{
printf("hallo world!\n");
return 0;
}
定石と言ったらこれだろJK
0974デフォルトの名無しさん
2009/05/12(火) 13:17:06for(;;) で書くか while(1) で書くか…
0975デフォルトの名無しさん
2009/05/12(火) 13:21:18srand ( ( unsigned ) time ( NULL );
え?なんで?あるじゃん。
一応srandの上も確認するが、バグが見当たらない。
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;;
{;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; …ハハッVC2005め、エラーを出して構って欲しかったのか。
ヾ;;;ハ ノ .::!lリ;;r゙ 全くツンデレだなお前は。
`Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が
,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました
~''戈ヽ `二´ r'´:::. `!
0976デフォルトの名無しさん
2009/05/12(火) 13:42:070977デフォルトの名無しさん
2009/05/12(火) 16:28:13whileに定数書いたらコンパイラに注意されたことがある
0978デフォルトの名無しさん
2009/05/12(火) 16:47:39同じような間違いをなんどか見たことあるけど、
こういう人って入門書とか読まずにリファレンスだけで勉強してるのだろうか。
0979デフォルトの名無しさん
2009/05/12(火) 16:50:490980デフォルトの名無しさん
2009/05/12(火) 16:58:250981デフォルトの名無しさん
2009/05/12(火) 17:50:22それ以外は絶対に使わない
0982デフォルトの名無しさん
2009/05/12(火) 21:02:050983デフォルトの名無しさん
2009/05/12(火) 21:04:450984デフォルトの名無しさん
2009/05/12(火) 21:05:36C言語なら俺に聞け(入門篇) Part 48
http://pc12.2ch.net/test/read.cgi/tech/1242129892/
0985デフォルトの名無しさん
2009/05/12(火) 22:10:211番の方法と2番の方法のどちらの方法を選ぶのが良いでしょうか?
#include<stdio.h>
#include<stdlib.h>
void swap(int *a, int *b){
int c;
c=*a;
*a=*b;
*b=c;
}
int main(void){
int i, card[52];
for(i=0;i<52;i++) card[i]=i;
for(i=0;i<52;i++) swap(&card[i], &card[rand()%(i+1)]); // 1番
for(i=0;i<52;i++) card[i]=i;
for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52-i)]); // 2番
return 0;
}
0986デフォルトの名無しさん
2009/05/12(火) 22:17:01「シャッフル アルゴリズム」でググるといろいろでてくると思う。
0987デフォルトの名無しさん
2009/05/12(火) 22:17:39for(数回)
{
for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52)]);
}
が、まだまし
0988デフォルトの名無しさん
2009/05/12(火) 22:20:14添え字がオーバーしとるがな
0989デフォルトの名無しさん
2009/05/12(火) 22:22:31fisher yatesでぐぐれ
直感的にも正しい(実質ランダムに一枚づつ抽出と同じであることが容易に理解できる)ものだし
ループは一重で済むし
>>987
糞以下のものをだすな
0990デフォルトの名無しさん
2009/05/12(火) 22:23:44for(数回)
{
for(i=0;i<52;i++) swap(&card[i], &card[rand()%(52)]);
}
訂正や
0991985
2009/05/12(火) 22:30:18こんな感じでしょうか
for(i=0;i<52;i++) card[i]=i;
for(i=52-1;i>=0;i--) swap(&card[i], &card[rand()%(i+1)]);
ぱっと見は1番に近いですが
アルゴリズムの内容的には2番と一緒になりますね
0992デフォルトの名無しさん
2009/05/12(火) 22:45:412番よりも >>991 の方がリテラル埋め込みが少ないからオススメ
0993デフォルトの名無しさん
2009/05/12(火) 23:37:59for(i=0; i<52; i++) {
j = rand() % (i + 1);
card[i] = card[j];
card[j] = i;
}
で初期化とシャッフルを同時にやるのはどうよ?
0994デフォルトの名無しさん
2009/05/12(火) 23:40:390995デフォルトの名無しさん
2009/05/13(水) 00:00:01n = rand()%52;
for(j = 0; j < n; j++){
swap(&card[j], &card[n+j]);
for(k = n; k < 51; k++ )
swap(&card[k], &card[k+1]);
}
}
0996デフォルトの名無しさん
2009/05/13(水) 00:10:48若干偏りのでるアルゴリズムではあるが
実用上は問題ないのでは?
0997デフォルトの名無しさん
2009/05/13(水) 00:15:430998デフォルトの名無しさん
2009/05/13(水) 00:16:03どういうアルゴリズムでやっているか概略を知っている方いらっ
しゃいましたらご教授下さい。(オンメモリなのかそうでないか
とか)
0999デフォルトの名無しさん
2009/05/13(水) 00:32:32sortにはメモリバッファのサイズを指定するオプションがあるので、
メモリが少ない時は少ないなりのアルゴリズムでやってるのかな。
役に立たんレスで済まんね。
1000デフォルトの名無しさん
2009/05/13(水) 00:53:1010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。